深入談談整型 浮點型在記憶體中的儲存方式

2021-09-26 02:21:21 字數 2039 閱讀 5816

一、正整型

正整型,沒什麼好說的,就是補碼儲存方式,正數的補碼和原碼相同,即先轉換為二進位制,然後高位擴充套件0,一直填充至32位……

比如:5這個數的儲存方式如下

先轉換為二進位制:101

因為只有3位,所以前面填充29個0,即 00000000 00000000 00000000 00000101

二、負整型

負整型,跟正整型一樣,也是補碼儲存方式,不過負數的補碼計算方式是取絕對值的二進位制,按位取反再加1

比如:-5這個數

先取絕對值,即5,即 00000000 00000000 00000000 00000101

然後按位取反:11111111 11111111 11111111 11111010

再加1:即 11111111 11111111 11111111 11111011

三、正浮點型

浮點型中有兩種,一種是4byte的float型,一種是8byte的double型,這兩種計算方式都一致,只是有點點區別

1、float型:

float型是遵循ieee r32.24規範,即1位符號位、8位階碼、23位尾數

具體計算方式是先用科學計數法表示出該數的二進位制,然後計算出階碼值,最後把尾數 補足23位,依此儲存

比如125.5這個數

先看整數部分,125表示成二進位制是1111101,(整數轉換二進位制是除二取餘)

再看小數部分,0.5表示成二進位制是0.1,(小數轉換二進位制是乘二取整)

所以125.5用二進位制表示就是1111101.1,轉換成科學計數法就是1.1111011 x 2^6(階數為6)

但是這裡的階碼是用移碼的形式表示,float型的偏置量是127,於是6+127=133,即10000101

階碼:這裡階碼採用移碼表示,對於float型資料其規定偏置量為127,階碼有正有負,對於8位二進位制,則其表示範圍為-128-127,double型規定為1023,其表示範圍為-1024-1023。比如對於float型資料,若階碼的真實值為2,則加上127後為129,其階碼表示形式為10000010

尾數:有效數字位,即部分二進位制位(小數點後面的二進位制位),因為規定m的整數部分恒為1,所以這個1就不進行儲存了。

)這裡前面的9位就出來了,因為是正數,所以符號位為0,階碼為10000101

後面的尾數就是1111011,在後面補0,湊齊23位,即 1111011 00000000 00000000(因為科學計數法的整數部分總是為1,所以,這個1不用儲存)

所以125.5的儲存方式為 0 10000101 11110110000000000000000

即: 01000010 11111011 00000000 00000000

2、double型

double型跟float型計算方式類似,不過區別在於double型遵循ieee r64.53規範

a、double的符號位是1位,階碼為11位,尾數為52位

b、double的偏置量是1023,而float是127

四、負浮點型

和上面一樣,不過就是符號位用1表示,就這點小區別

五、驗證方式

有兩種驗證方式,一種是用聯合體的方法、一種是強制型別轉換方法

1、聯合體法:

可以定義乙個聯合體,比如

union data

;那麼可以對a賦值,然後依次輸出陣列array的各個元素,這樣就可以驗證

2、強制型別轉換法:

float a;

char *p=(char *)&a;

這樣,將a的位址強制轉換為指向字元型別之後,賦值給指標p,後續再依次輸出*p、*(p+1)、*(p+2)、*(p+3)的值,也可以進行驗證

例:#include

int main(int argc, char *ar**)

int main(int argc, char *ar**)

分析:0.5的二進位制形式為0.1,由於規定正數部分必須為1,將小數點右移1位,則為1.0*2^(-1);

0 01111110 00000000000000000000000

符號位 階碼轉化為二進位制(-1+127) 小數部分

裁剪:結果:

浮點型在記憶體中的儲存

以單精度型別變數為例 1.國際標準ieee 電氣和電子工程協會 754,任意乙個浮點數都可以表示為 1 s m 2 e,其中 1 s表示符號位,當資料為負時s 1,當資料為正時s 0 2 m表示有效數字位,它在記憶體中佔據23個位元位,它的取值範圍是大於等於1,小於2,而計算機對m進行存的時候只存小...

深度剖析資料在記憶體中的儲存(整型和浮點型)

我們知道乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的,而且不同的型別也影響著我們看待記憶體空間的視角。比如 int a 20,float b 5.0 接下來我們看看資料在所開闢的型別中是如何儲存的?整型家族 char unsigned char,signed char ...

浮點型資料在記憶體中的儲存

原文 學計算機n年了,一年懶得去了解小數的存放,趁今天想知道double資料存放格式,了解了一下,真是懶不得,無論什麼樣的基礎知道,早晚一天還是要學到心中的。一 浮點型資料在記憶體中儲存的表示 實數在記憶體中以規範化的浮點數存放,包括數符 階碼 尾數。數的精度取決於尾數的尾數。比如32位機上floa...