short i1=32767;
short i2=32768;
short i3=32769;
short i4=-32768;
short i5=-32769;
cout<<i1<<endl; //32767
cout<<i2<<endl; //-32768
cout<<i3<<endl; //-32767
cout<<i4<<endl; //-32768
cout<<i5<<endl; //32767
unsigned short j1=65535;
unsigned short j2=65536;
unsigned short j3=65537;
unsigned short j4=-65535;
unsigned short j5=-65536;
unsigned short j6=-1;
cout<<j1<<endl; //65535
cout<<j2<<endl; //0
cout<<j3<<endl; //1
cout<<j4<<endl; //1
cout<<j5<<endl; //0
cout<<j6<<endl; //65535
計算機基礎知識不紮實 想了半天 查了半天資料 才基本摸清楚(若有問題 希望有人能給我講一下 )
首先 對於 signed short 其 共有16個字節(對於我的機子是這樣的) 第一位是符號位
注意在計算機中 整形是用的 補碼進行存儲 正數的補碼就是他自己 負數的補碼 是其除符號位以外 其他各位求反後 ,最後位再加一
對於有符號的 第一位 爲符號位 0爲正 1爲負
利用補碼可以拓寬整數的下界 即若用原碼錶達 (位數爲8時 )最小值 爲 1111 1111 1111 1111值爲 -127 其補碼爲1000 0000 0000 0001
大家可以很清楚的看到 補碼還可以再減一的 (即-127-1=-128)爲 1000 0000 0000 0000.
其表達數字的範圍爲 1000 0000 0000 0000-------0111 1111 1111 1111 故 其範圍爲 -32768---32767
所以對於上面輸入的 i1 , i4結果就很清楚
那麼對於 i2 : 0111 1111 1111 1111 +1 計算其值爲 1000 0000 0000 0000 爲 -32768
對於 i3 : 1000 0000 0000 0000 +1 計算其值爲 1000 0000 0000 0001 因爲是補碼 所以 換爲原碼就是1111 1111 1111 1111 即爲 -32767
對於i5 : 1000 0000 0000 0000 -1 計算其值爲 0111 1111 1111 1111 正數的補碼還是自己 所以 其值就是 32767
好了 對於有符號的搞清楚了 對於無符號的 就簡單多了 無符號的 能表達的範圍 爲 0000 0000 0000 0000-------1111 1111 1111 1111 即 0---65535
對於 j1 不解釋
對於 j2 1111 1111 1111 1111 + 1 =0000 0000 0000 0000 第一位越界被解掉了
對於 j3 再加1而已 不解釋
對於 j4 -65535 (事實上不存儲 越界的位數 這裏我們借一位 作解釋) 原碼 爲 1 1111 1111 1111 11111 其補碼爲 1 0000 0000 0000 0001
然後截掉第一位 剩下的爲 0000 0000 0000 0001 值就爲1了
對於 j5 若按上面的方法 其補碼爲 1 0000 0000 0000 0000 截掉第一位 值爲0 或是 用 -65535-1 =1-1=0
對於 j6 其原碼 爲 1000 0000 0000 0001 補碼爲 1111 1111 1111 1111 值爲 65535
嗯 差不多解釋成這樣了 關鍵是要搞明白 有符號時的 1000 0000 0000 0000 表達的數是多少 這是 所有問題的轉折點了