本文介紹移碼以及浮點數的二進位制表示。其中浮點數的二進位制表示比較難理解,需要一點點數學知識。
在一般情況下,移碼就是將補碼的符號位取反。
-118d = -1110110b (真值)
-118d表示-118的十進位制;-1110110b表示二進位制。
原碼: 11110110
反碼: 10001001
補碼: 10001010
移碼: 00001010
符號位取反的移碼,可以等同於偏移值為128的移碼,稱為標準移碼。
即-118d+128d = 10001010b + 10000000b = 00001010b。
移碼,可以理解為補碼加上偏移值,即將整個取值範圍右移一段距離,從移碼中可以直接看出真值的大小。
-128[移]: 00000000
-127[移]: 00000001
-126[移]: 00000010
……+126[移]: 11111110
+127[移]: 11111111
x[移] = 2^(n-1) + x, -2^(n-1) <= x <= 2^(n-1) -1
x為真值,x[移]表示真值x的移碼。
舉個栗子:
乙個位元組,n=8。x[移] = 128 + x, -128 <= x <= 127
浮點數的二進位制表示,分為三個部分。
sign,符號位。0表示正,1表示負。
exponent,指數字。採用2^(n-1) - 1的移碼。n表示指數字位數。
fraction,小數字。
浮點數的位數如表所示。
—-sign
exponent
移碼fraction
32位1
82^(8 - 1) - 1 = 127
2364位111
2^(11 - 1) - 1 = 1023
52浮點數的二進位制表示用數學表示。
v= (−1)^s ×m × 2^e
(-1)^s表示符號位,當s=0,v為正數;當s=1,v為負數。
m表示有效數字,大於等於1,小於2。
e表示浮點數的指數。
對於m,1<=m<2,m可以寫成1.******的形式,其中******就是小數部分,由0,1組成。ieee754規定,第一位總是1,可以被捨去,只儲存後面的******部分。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。
指數e的特殊情況(32位浮點數為例)
浮點數的指數e
e的值m的值
數值-1270全0
±0-127
0m小數點前不加1
0.******的形式
128255
全0±無窮
128255
非0nan
注:
9.0的表示方法:
為正數,所以sign=0。
9.0d = 1001.0b = 1.001*2^3b。注意:小數點不是十進位制的小數點,是二進位制的小數點。 1.001d ≠ 1.001b。
所以exponent的原值是3,移值是3+127=130d=10000010b。
分數部分,去掉第一位的1,剩餘001 在後面補充0,保證23位,即00100000000000000000000。
合併起來,結果為0 10000010 00100000000000000000000。
0.625的表示方法:
為正數,sign=0。
0.625d = 0.101b。其中0.1b = 0.5d = (1/2)^1;0.01b = 0.25d = (1/2)^2;0.001b = 0.125d = (1/2)^3。
0.625d = 0.101b = 1.01 * 2^(-1)。
所以exponent的原值為-1,採用移植是-1+127=126d=01111110b
分數部分,去掉第一位的1,剩餘01,在後面補充0,保證23位 01000000000000000000000
合併起來,結果為0 01111110 01000000000000000000000
移碼即補碼右移乙個偏移量。
浮點數的二進位制表示,還是很頭暈的。看不懂,多看幾遍。如果還是看不懂,那就看不懂吧。
~~ eof ~~
浮點數的二進位制
1.前幾天,我在讀一本c語言教材,有一道例題 include void main void 在我的編譯器下 編譯是會發生錯誤的。錯誤 cannot convert from int to float win7 vc6.0 sp6 執行結果如下 num的值為 9 pfloat的值為 0.000000 ...
浮點數轉化二進位制
乙個int型別表示的整數值是 2 31 2 31 1 32位二進位制表示 1111111111111111 11111111 11111111 011111111 11111111 11111111 1111111 類似整數聯想到浮點數是怎麼表示的呢?最初正常人可能為這樣想的 但是這樣好像表示的數也...
了解二進位制浮點數運算
所有的浮點數值計算都遵循ieee 754規範。ieee 754規定了四種表示浮點數值的方式 單精確度 32位 雙精確度 64位 延伸單精確度 43位以上,很少使用 與延伸雙精確度 79位元以上,通常以80位元實做 只有32位模式有強制要求,其他都是選擇性的。大部分程式語言都有提供ieee格式與算術,...