добавление неподписанного int в int [duplicate]

На этот вопрос уже есть ответ здесь:

Преобразование без знака в C - всегда ли это безопасно? 8 ответов
#include 
int main ()
{
    using namespace std;
    unsigned int i = 4;
    int a = -40;
    cout
 Suvarna Pattayil24 мая 2013 г., 07:42
Проверьтеэтот один тоже.

Ответы на вопрос(2)

Представьте i и a в шестнадцатеричном виде:

i =   4: 0x 0000 0004
a = -40: 0x FFFF FFD8  

Следуя неявным правилам преобразования C ++, в+ я будет приведен к unsigned int, то есть 4294967256. Так+ i = 4294967260

Решение Вопроса

Когдаunsigned int иint сложены вместе,int сначала преобразуется вunsigned int до добавления происходит (и результат такжеunsigned int).

-1, будучи первым отрицательным числом, фактически эквивалентно наибольшему числу без знака, то есть.(unsigned int) -1 === UINT_MAX

-2 в неподписанном видеUINT_MAX - 1и так далее, так-40 === UINT_MAX - 39 === 4294967256 (при использовании 32-битных целых).

Конечно, добавив 4, вы получите ответ:.4294967256 + 4 = 4294967260

Это отличный тест, где вы можете узнать некоторые правила целых чисел в C (и аналогично C ++):http://blog.regehr.org/archives/721

 almanegra12 янв. 2016 г., 21:41
Почемуint преобразуется вunsigned а не наоборот?
 wcochran29 янв. 2019 г., 21:07
Для двоих's дополняют вас тем же битовым шаблоном - контекст результата (который, по-видимому, по умолчанию не подписан) определяет, будет ли результат подписан или не подписан.
 Sellorio24 мая 2013 г., 07:49
Правильный. Альтернативой этому является превращение 4 в int, а затем добавление их, а затем, если вы хотите, чтобы unsigned int выполнял блок if, если в результате>= 0, то он преобразуется в беззнаковое целое.

Ваш ответ на вопрос