原碼、反碼、補碼
原碼就是人最直觀的理解,對于有符號數,其最高位為符號位,例如對于8位有符號整數,[0000 1001]表示十進制下的7,而[1000 1001]表示的是十進制下的-7,
為什么要引入補碼的概念呢?
計算機記憶體里面都是二進制的形式存盤的,如果在計算機中如果用原碼來表示一個數的話,在進行運算的時候還需要識別其符號位,在計算機中其實沒有用來實作減法的邏輯門,它是通過加法來實作的,因為任何減法比如X - Y都可以表示為X + (-Y),
為了方便計算機直接進行運算,引入補碼,
例如-2+3=1;
-2的原碼:1000 0010,補碼1111 1110
3的原碼: 0000 0011,補碼0000 0011
如果用原碼計算,逐位相加,得到的結果1000 0101,表示的是-5,所以是錯的
采用補碼的話,得到的補碼結果是0000 0001,原碼為0000 0001,值為1,是正確的結果,
補碼 = 原碼取反 (符號位不變)+ 1;
-2的補碼:1000 0010取反得到1111 0010,然后+1, 得到補碼1111 0011
正數的原碼、反碼、補碼都是它本身
對于8位有符號數,他的范圍是[-128 127],即1000 0000~0111 1111(補碼),
很多人會有疑問,為什么不是1111 1111(原碼)即-127(補碼1000 0001)
-127-1=-128?怎么得到的
在計算機內用補碼進行計算 -127-1=1000 0001+1111 1111(符號位也要相加)
得出來的結果1 1000 0000,有一個溢位位,為了方便理解,此時可以看做成符號位,則他的原碼為1 1000 0000所以為-128,事實上規定的是1000 0000是8位下最小的整數值,不要糾結是怎么來的,
如果-128繼續減1等于多少呢?
用補碼計算,1000 0000+1111 1111 = 0111 1111 這個值就是8有符號數的最大值127,
所以得到:最小值 = 最大值+1;也可以說成最大值 = 最小值-1;
下圖是8位二進制有符號數補碼變化輪盤,

浮點型別存盤
int n = 13;
float *pFloat = (float *)&n;
printf("n的值為:%d\n", n);
printf("*pFloat的值為:%f\n", *pFloat);
*pFloat = 13.0;
printf("n的值為:%d\n", n);
printf("*pFloat的值為:%f\n", *pFloat);
上述代碼的最終輸出結果為
n的值為:13
*pFloat的值為:0.000000
n的值為:1095761920
*pFloat的值為:13.000000
為什么加粗的地方是這個值?
根據IEEE二進制浮點數算術標準(IEEE 754)
一個浮點數value = sign*exponent*fraction;
其中sign為符號位,exponent為指數偏移,fraction為分數值,
為了簡化表達,定義任何一個二進制浮點數V = (-1)^S*M*2^E;其中S為0時V為正數,為1時V為負數;M表示有效位數字,范圍[1,2);2^E為指數位;
假設10進制下的5.0寫成二進制下為101.0,寫成上面的形式則為1.01*2^2,指數偏移E相當于小數點需要偏移幾位,所以S = 0;M=1.01;E=2;
下圖為32位單精度浮點存盤模型:

注意E為無符號數,則他的范圍是0-255,而在科學計數法里面E的值可以為負數,所以實際上需要加入一個偏移量,取中間值127,上述例子的E=2,則實際值為129,二進制為1000 0001,例如十進制0.5,二進制下為0.1,則轉換為上述形式1.0*2^(-1),S=0;E=-1;M=1.0;實際的E為126, 二進制下為0111 1110,
E全為0的時候表示接近于0;E全為1的時候表示正無窮或者負無窮,
計算機存盤M的時候只存盤小數點后面的值,默認小數點前的數為1;
回答上面的問題
為什么13轉化為浮點數變成了0.000000,13在32位int下表示為0x0000000D
0000 0000 0000 0000 0000 0000 0000 1101
對應S=0,E=0000 0000,M=000 0000 0000 0000 0000 1101
S=0,E全為0,表示非常接近0的正數,所以用小數表示就為0.000000;
而通過*pFloat=13.0,使得這塊類存空間存盤的是浮點型別的值;二進制1101.0;轉化為(-1)^0*1.101*2^3,S=0,E=3,M=1.101,E實際上是130,
最終32位存盤的結果為:0 1000 0010 101 0000 0000 0000 0000 0000
對應32位整型的值為1095761920,
對于64位雙精度浮點型別S:1bit,E:11bit,M:52bit
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/304985.html
標籤:其他
上一篇:CAD快捷鍵大全
