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