2013-05-24 5 views
1
#include <iostream> 
int main() 
{ 
    using namespace std; 
    unsigned int i = 4; 
    int a = -40; 
    cout<<a+i<<endl; 
    return 0; 
} 

Исполнительным это дает мне 4294967260добавление беззнакового целочисленное значения в целом

Я знаю, что есть преобразование происходит из подписанных межд беззнакового Int, но как и почему это особое значение? Я заметил, что это близко к сумме | 2147483647 | + 2147483647

+1

Проверьте [это] (http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe) тоже. –

ответ

8

Когда 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

+0

Исправить. Альтернативой этому является превращение 4 в int, а затем их добавление, а затем, если вы хотите, чтобы unsigned int выполнял блок if, если результат равен> = 0, то он преобразуется в unsigned int. –

+0

Почему 'int' преобразуется в' unsigned', а не наоборот? – almanegra

1

Представляют я и в шестнадцатеричном формате:

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

После неявного преобразования правила C++, в а + будет приведен к неподписанных Int, то есть, 4294967256. Так а + я = 4294967260