輸出無符號應當用%u、%lu等等。
unsigned int 是0-4294967295,你輸入的是4294967294,這個是符號整數,0xfffffffe,對應的符號整數就是負2.

雖然你聲明的類型是unsigned int,但是列印用的是%d,這個是有符號整數的,如果要列印無符號整數,用%ud。用%d會進行類型轉換,相當於(int)(a),0xfffffffe就變成-2了


無論是什麼類型的數字,在內存裡面都是一串二進位而已。你要給print方法指定列印的類型她才會正常顯示哦。而你指定的是有符號整數。


int signedInt = -1;printf("%u
", signedInt);這裡列印的就是4294967295了。計算機怎麼得到這個數的呢?首先[-1]=[1000 …… 0000 0001]二進位

[-1] + 2^32 = [0000 0000 …… 0000 0000]原 = [1111 1111 …… 1111 1111]反碼 = 4294967295

以後有符號的負數轉為無符號的,都要先加 2^32 後再取反,就可以與其它數相加了。
最近學了補碼,這個問題迎刃而解


推薦閱讀:
相关文章