整數的二進制存儲問題(以 short 和 unsigned short 爲例)

今天折騰的好久 二進制的問題 我們先看下面的小例子和結果 (運行環境爲vs2010)

     

 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 表達的數是多少 這是 所有問題的轉折點了






發佈了21 篇原創文章 · 獲贊 37 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章