Ужасные ответы в изобилии
Озгур Озцитак
Когда вы разыгрываете из подписанного в неподписанное
(и наоборот) внутренний
представление числа не
менять. Какие изменения, как
Компилятор интерпретирует знаковый бит.
Это совершенно неправильно.
Матс Фредрикссон
Когда один неподписанный и один подписанный
переменные добавляются (или любой двоичный
операция) оба неявно
преобразован в неподписанный, который будет в
этот случай приводит к огромному результату.
Это тоже неправильно. Целые числа без знака могут быть преобразованы в целые, если они имеют одинаковую точность из-за битов заполнения в типе без знака.
SMH
Ваша операция добавления вызывает int
для преобразования в беззнаковое целое.
Неправильно. Может быть, да, а может и нет.
Преобразование из неподписанного целого в подписанное
int зависит от реализации. (Но
это, вероятно, работает так, как вы ожидаете
на большинстве платформ в эти дни.)
Неправильно. Это либо неопределенное поведение, если оно вызывает переполнение, либо значение сохраняется.
Anonymous
Значение i преобразуется в
без знака int ...
Неправильно. Зависит от точности int относительно беззнакового int.
Тейлор Цена
Как уже было сказано ранее, вы можете
бросать взад и вперед между подписанным и
без знака без проблем.
Неправильно. Попытка сохранить значение вне диапазона целого числа со знаком приводит к неопределенному поведению.
Теперь я наконец могу ответить на вопрос.
Если точность int будет равна unsigned int, вы будете переведены в int со знаком, и вы получите значение -4444 из выражения (u + i). Теперь, если у вас и у меня есть другие значения, вы можете получить переполнение и неопределенное поведение, но с этими точными числами вы получите -4444 [1] . Это значение будет иметь тип int. Но вы пытаетесь сохранить это значение в unsigned int, чтобы затем оно было приведено к unsigned int, и в результате получилось бы следующее значение (UINT_MAX + 1) - 4444.
Если точность unsigned int будет больше, чем точность int, знаковое int будет преобразовано в unsigned int, что даст значение (UINT_MAX + 1) - 5678, которое будет добавлено к другому unsigned int 1234. Если u и у меня есть другие значения, которые заставляют выражение выходить за пределы диапазона {0..UINT_MAX}, значение (UINT_MAX + 1) будет либо добавлено, либо вычтено, пока результат не попадет в диапазон {0..UINT_MAX) и не будет неопределенным поведение будет происходить.
Что такое точность?
Целые числа имеют биты заполнения, знаковые биты и биты значений. Целые числа без знака, очевидно, не имеют знакового бита. Также гарантируется, что беззнаковый символ не будет иметь битов заполнения. Число битов значений, которые имеет целое число, это то, сколько точности оно имеет.
[Gotchas]
Макрос sizeof macro сам по себе не может использоваться для определения точности целого числа, если присутствуют биты заполнения. И размер байта не обязательно должен быть октетом (восемь битов), как определено в C99.
[1] Переполнение может произойти в одной из двух точек. Либо перед добавлением (во время продвижения) - когда у вас есть неподписанное целое число, которое слишком велико, чтобы поместиться в нем. Переполнение может также произойти после добавления, даже если unsigned int находилось в диапазоне int, после добавления результат может все еще переполниться.
На несвязанной ноте я недавно аспирант, пытающийся найти работу;)