Объясните разницу между int и unsigned int

Если в unsigned int записывают значение, которое не помещается в диапазон допустимых значений, к числу прибавляется или от числа отнимается 4294967296 до тех пор, пока результат не станет помещаться в диапазон допустимых значений для unsigned int . Здесь предполагается, что unsigned int — 32-битный.
Когда складываются два unsigned int числа, к результату прибавляется или от результата отнимается 4294967296 до тех пор, пока результат не станет помещаться в диапазон допустимых значений для unsigned int . Это число ты и видишь.
А, да. Когда к unsigned int прибавляют int , а 25 это int , то int сначала приводится к значению, допустимому для unsigned int . Всё теми же прибавлениями и вычитаниями 4294967296. А уже потом два unsigned int складываются.
i-rinat ★★★★★
( 28.11.20 00:51:32 MSK )
Последнее исправление: i-rinat 28.11.20 00:53:30 MSK (всего исправлений: 1)
Ответ на: комментарий от i-rinat 28.11.20 00:51:32 MSK

не очень понял. вот я в unsigned ставлю -100, оно не подходит. К нему прибавляется 4294967296, далее по коду прибавляется 75,(кстати, почему 75 это int? оно не может быть unsigned int?) каким образом по итогу выходит 25?
PURGEN143 ★
( 28.11.20 01:02:29 MSK ) автор топика

1. Прочитай, как положительные и отрицательные числа записываются в двоичной системе.
2. Запиши все приведённые числа в двоичной системе.
3. Проведи над ними все описанные в посте операции. Не забывая про разрядность (т.е. отбрасывая все старшие разряды, которые не укладываются в размер типа).
4. Переведи полученное обратно в десятичную систему. Примерно на этом этапе ты уже должен будешь всё понять.
gremlin_the_red ★★★★★
( 28.11.20 01:06:15 MSK )
Последнее исправление: gremlin_the_red 28.11.20 01:06:36 MSK (всего исправлений: 1)
Ответ на: комментарий от PURGEN143 28.11.20 01:02:29 MSK
когда ты кладёшь в 32-ух битный unsigned int отрицательное число происходит переполнение двоичного числа и кладётся (0 — 50) попробуйте выполнить в двоичном виде — операция побитово выполнится, но как бы с вовлечением недоступных битов, т.е. будет выглядеть как будто вы заняли(что равно прибавлению) 33-ий бит которого нет и в ячейку будет сохранено число 2^32 — 50, затем прибавляя 75 вы вновь вызываете переполнение(только в другую сторону) для суммы 2^32 — 50 и 75 — по идее вы должны будете перенести 1 бит в 33 бит, но опять же т.к. его нет получится его отбрасывание эквивалентное вычитанию и получится: 2^32 — 50 + 75 — 2^32 = 25, это более менее представимая в голове интерпретация, в действительности отрицательное число как правило хранится с дополнением до единицы и по сути когда вы просите положить в беззнаковое хранилище отрицательное число a в него кладётся дополненное до единицы вида ~a + 1 или в более простом виде 2^32 — a
Правда это в теории, на практике компилятор в данном случае оптимизирует код и делает во время компиляции расчёты в более широких типах данных, дабы не было переполнений
В целом действительно стоит почитать про хранение чисел на цифровых вычислительных устройствах, например по школьному учебнику информатики(8-9 класс) или по Харрисам
AKonia ★★
( 28.11.20 01:10:27 MSK )
Последнее исправление: AKonia 28.11.20 01:26:04 MSK (всего исправлений: 9)
Объясните разницу между int и unsigned int
unsigned int — это арифметика в кольце Z_ . int — это арифметика на Z , кидающая UB при выходе за пределы [-2^31, 2^31) , так называемом «переполнении». unsigned переполниться не может
Crocodoom ★★★★★
( 28.11.20 01:16:29 MSK )
Ответ на: комментарий от PURGEN143 28.11.20 01:02:29 MSK
Приводя отрицательное число к беззнаковому ты получаешь число близкое к максимальному, потом ты прибавляешь к нему ещё, тем самым переполняя его, где в итоге 25 и является результатом переполнения.
WitcherGeralt ★★
( 28.11.20 01:22:43 MSK )
Ответ на: комментарий от PURGEN143 28.11.20 01:02:29 MSK

каким образом по итогу выходит 25
Из-за переполнения заворачивается через 0. Т.е. …max-2, max-1, max, 0, 1… Твои -50 будут max-50. Прибавь 75, что получиться?
no-such-file ★★★★★
( 28.11.20 01:27:40 MSK )

75 это int , а вот 75u это unsigned int . Когда ты кладёшь int в unsigned int туда записывается просто бинарное представление int , если ты выведешь a , результат будет не -50 . Но при сложении со знаковым типом, а именно он выберется как приоритетный, a будет приведено к знаковому.
pon4ik ★★★★★
( 28.11.20 01:31:43 MSK )
signed от unsigned отличается при сдвиге вправо, при переполнении и оптимизация, а в процессоре — только при интерпретации флагов, выставляемых по результатам операции.
salozar
( 28.11.20 01:32:32 MSK )
Ответ на: комментарий от pon4ik 28.11.20 01:31:43 MSK

Но при сложении со знаковым типом, а именно он выберется как приоритетный, a будет приведено к знаковому.
Нет же. Если битность одинаковая, то знаковое приводится к беззнаковому, а не беззнаковое к знаковому.
в чем разница между int a и int *a?

люди подскажите начинающему.
чем переменная отличается от указателя?
допустим переменные int a char a ? и переменные int *a, char *a. В первом случае все понятно переменные да переменные, а вот с указателями как они указывают что если char то множество символов каких то? и в чем разница их преминения? тоесть где лучше применять их? можно пример если есть у кого простой для понимания? и еще спросить хотел что такое динамический массив, чем он от простого отличается ? в чем разница его обхявления в программе? и для чего он может быть использован? тоже можно если есть у кого и по нему пример. Заранее спасибо
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
в чем разница между int(a) и (int)a?
Собственно в этом и вопрос.
В чем разница между int main()<> и int main(void)<>?
Только недавно начал изучать язык, и появилось несколько вопросов: 1) в чем разница между int.
Какая из этих функций int Q(int w) int W(int y,int u,int i) сработает быстрее?
Если есть 2 функции(простые или перегруженные) к примеру Q(int w) int W(int y,int u,int i)или int.
int const и const int в чем разница этих записей
Попалась мне тут программа для выборочно сортировки, с ней все в принципе ясно, но я в ней встретил.
В чём отличие int от long int?
Чем отличается int от long int? В документации компилятора Microsoft C++ указано, что диапазон значений у них равен, и памяти они потребляют одинаковое количество.
- Вопрос задан более трёх лет назад
- 582 просмотра
1 комментарий
Простой 1 комментарий

В случае компилятора MS разницы нет, но у других компиляторов может быть иначе.
Из-за этого я считаю, что лучше использовать fixed width types, где это возможно https://en.cppreference.com/w/cpp/types/integer
Решения вопроса 1
У Microsoft C++ ни в чем.
Стандарт C ограничивает минимальный размер типов int, при этом sizeof(long) >= sizeof(int) >= sizeof(short) >= sizeof(char).
Ответ написан более трёх лет назад
Нравится 2
Ответы на вопрос 1
vanyamba-electronics @vanyamba-electronics
Зависит от платформы. В INT32 sizeof(long) равен 32 бита, в INT64 sizeof(long) равен 64 бита.
Ответ написан более трёх лет назад
Ваш ответ на вопрос
Вопрос закрыт для ответов и комментариев
Потому что уже есть похожий вопрос.

- Linux
- +1 ещё
Как сделать многопоток сокетов?
- 1 подписчик
- 9 часов назад
- 67 просмотров
[C++] int *i и int* i; int &i и int& i
Есть страуструповское решение — он советует использовать int* i.
Что вы можете сказать по этому поводу? Я всегда использовал int *i. То же самое наблюдаю в Qt.
Obey-Kun ★★★★★
20.01.11 13:46:15 MSK
← 1 2 →

второй вариант более нагляднее и сразу видно что это, без лишних движений гововы.
Boy_from_Jungle ★★★★
( 20.01.11 13:49:46 MSK )

Разницы никакой, но int *i нагляднее.
post-factum ★★★★★
( 20.01.11 13:50:43 MSK )
Ответ на: комментарий от Boy_from_Jungle 20.01.11 13:49:46 MSK
> более нагляднее
Obey-Kun ★★★★★
( 20.01.11 13:50:45 MSK ) автор топика

int *i;
int* i;
да чтобы ты писал
int *i, *j, *k;
и не написал случАем
int* i, j, k;
shty ★★★★★
( 20.01.11 13:51:12 MSK )
Что вы можете сказать по этому поводу?
Могу сказать, что предпочитаю int *i. Аргументация стандартная:
int *p, *q; // оба указатели int* p, q; // q не указатель, как мог бы кто-нибудь подумать по той или иной причине
Не думаю, что вопрос заслуживает отдельной темы.
rival ★★
( 20.01.11 13:52:13 MSK )

Плевать. Использую int *i для наглядности
different_thing
( 20.01.11 13:56:53 MSK )
Ответ на: комментарий от rival 20.01.11 13:52:13 MSK
Именно поэтому я делаю так же. Но Страуструп вещает, что это неверный путь. Ссылку я дал в теме. Он единственный человек на Земле, который так думает?
Obey-Kun ★★★★★
( 20.01.11 13:57:21 MSK ) автор топика
Ответ на: комментарий от Obey-Kun 20.01.11 13:50:45 MSK

Смотри примеры ниже, когда сразу несколько переменных объявляешь
different_thing
( 20.01.11 13:58:03 MSK )
Ответ на: комментарий от Obey-Kun 20.01.11 13:57:21 MSK

Тебе есть дело до какого-то трупа страуса?
different_thing
( 20.01.11 13:58:35 MSK )
Я отношу * к типу и пишу int*. Я воспринимаю отдельно тип и отдельно имя переменной. Мне так проще парсить глазками код 😉
anonymous
( 20.01.11 14:00:13 MSK )
Есть еще третий вариант
int * i;
Reset ★★★★★
( 20.01.11 14:00:53 MSK )
Ответ на: комментарий от rival 20.01.11 13:52:13 MSK
> int* p, q; // q не указатель, как мог бы кто-нибудь подумать по той или иной причине
Кто-нибудь, не знающий основ языка не должен его трогать ВООБЩЕ.
anonymous
( 20.01.11 14:01:22 MSK )
Ответ на: комментарий от Reset 20.01.11 14:00:53 MSK
> Есть еще третий вариант
Незачёт, есть ещё вариант без пробелов. Встречается у большинства быдлостудентов (вкупе с отстутсвием вменяемой индентации)
anonymous
( 20.01.11 14:02:54 MSK )
Ответ на: комментарий от Reset 20.01.11 14:00:53 MSK

different_thing
( 20.01.11 14:04:03 MSK )
Не слушай тех, кто советует писать int *i, аргументируя это какой-то там наглядностью. Тип у i — указать на int, т.е. должно быть написано int* i. То, что нельзя три указателя объявить как int* i, j, k — это проблема синтаксиса языка (хотя, в любом случае, так переменный объявлять не совсем хорошо — лучше каждую на новой строке). В общем, гнилой это аргумент, имхо.
Дополнительный аргумент: попробуй передать ссылку на указать =)
kulti ★★
( 20.01.11 14:04:34 MSK )
Ответ на: комментарий от anonymous 20.01.11 14:01:22 MSK
> Кто-нибудь, не знающий основ языка не должен его трогать ВООБЩЕ.
Есть еще такой фактор как внимательность.
rival ★★
( 20.01.11 14:04:47 MSK )
Ответ на: комментарий от Obey-Kun 20.01.11 13:57:21 MSK

Но Страуструп вещает, что это неверный путь.
что он там вещает сейчас посмотрим:
The critical confusion comes (only) when people try to declare several pointers with a single declaration:
int* p, p1; // probable error: p1 is not an int*
Placing the * closer to the name does not make this kind of error significantly less likely.
int *p, p1; // probable error?
то есть признаёт проблему, но говорит что нафиг такие декларации использовать, и надо объявлять переменные по одной
Declaring one name per declaration minimizes the problem — in particular when we initialize the variables.
простите, но на вменяемую позицию — не катит, просто на обоснование своих привычек задним числом
shty ★★★★★
( 20.01.11 14:07:40 MSK )
Manhunt ★★★★★
( 20.01.11 14:07:48 MSK )
Ответ на: комментарий от kulti 20.01.11 14:04:34 MSK
> Не слушай тех, кто советует писать int *i, аргументируя это какой-то там наглядностью. Тип у i — указать на int, т.е. должно быть написано int* i.
Правильно. Плюс ещё лично я держу в голове типы переменных, и воспринимать тип переменной проще, когда тип и имя переменных — разделены.
То, что нельзя три указателя объявить как int* i, j, k — это проблема синтаксиса языка (хотя, в любом случае, так переменный объявлять не совсем хорошо — лучше каждую на новой строке).
Да, лучше по одному объявлению на строку + не забываем про иницализацию переменных в случае надобности. Незачем лепить всё в одну строку.
И, на мой взгляд, так же легко написать int* a, b; как и int *a, b; Обе — валидные конструкции. При попытки использовани b как указателя — вы получите ошибку компиляции. Так что такие проблемы будут найдены и заморачиваться не стоит. Включайте предупреждения и пишите код без них и будет счастье