int與float在記憶體中的儲存形式 對比與轉換

2021-07-08 15:52:11 字數 1371 閱讀 1113

看faac**中看到int與float的聯合體,看不懂**,於是對這兩種資料型別的儲存方式做了一番了解

typedef union fi_union;

//faac    aacquant.c   285行

int:

長度 4位元組

以補碼形式存數資料,首位為符號位,資料的二進位制原碼,經過反碼(符號位不變),再加1得到資料的補碼進行儲存

還原時可減1,再對非符號位進行反碼,記得到原碼,轉換為十進位制即可

float:

長度 4位元組

seee eeee    emmm mmmm    mmmm mmmm    mmmm mmmm

s: 表示浮點數正負,1為負數,0為正數

e: 指數加上127後的值的二進位制數(還原時將該數減127,得到指數的二進位制)

m: 底數,表示小數點後的二進位制,隱含了個位上的1,即還原時,底數為1.mmmmm...

注意:這裡有個特例,浮點數 為0時,指數和底數都為0,但此前的公式不成立。因為2的0次方為1,所以,0是個特例。當然,這個特例也不用認為去干擾,編譯器會自動去識別。

如-12.5的float形式為

11000001    01001000    00000000    00000000

s:1,負數

e:1000001 0 == 130 減去127得3,即指數為3

m:100 1000 0000 0000 0000 0000 實際底數為1.1001

還原:符號 2^3 乘以 1.1001 即小數點右移3位 得到1100.1 即12.5(注意0.1表示2的-1次方,這裡1在第-1位上)

加符號即得-12.5

為了驗證int與float之間的轉換,可以把-12.5的二進位制按照int型翻譯成十進位制

符號位:1

補碼:100 0001 0100 1000 0000 0000 0000 0000

減一:100 0001 0100 0111 1111 1111 1111 1111

反碼:011 1110 1011 1000 0000 0000 0000 0000

十進位制:1052246016

即-1052246016

利用union驗證,分別按%d %f 輸出

補充double型

double:

長度 8位元組

儲存模式與float相同,只不過不同欄位的長度不同,見下表

符號位   階碼   尾數   長度 

float           1      8     23       32 

double       1     11    52       64 

其還原的計算方式完全相同。

double到float怎麼轉換?關鍵是階碼怎麼擷取?

Java基礎之float資料在記憶體中的儲存

1 float型別數字在計算機中用4個位元組儲存。遵循ieee 754格式標準 乙個浮點數有2部分組成 底數m和指數e。格式 seee eeee emmm mmmm mmmm mmmm mmmm mmmm s表示浮點數正負 e指數加上127後的值得二進位制資料 m底數2 底數部分 使用二進位制數來表...

float在記憶體中的儲存

以下內容來自於 1.十進位制轉二進位制 1.1整數 11 2 5 餘 1 5 2 2 餘 1 2 2 1 餘 0 1 2 0 餘 1 0結束 11二進位制表示為 從下往上 1011 1.2小數 0.9 2 1.8 取整數部分 1 0.8 1.8的小數部分 2 1.6 取整數部分 1 0.6 2 1....

float 型別在記憶體中的結構

float 在32位機上是 4個位元組的。它的結構是這樣子的 1位符號位 8 位指數字 23尾數字 其中指數是指以2 為底的指數,因為指數可能為負數,比如十進位制小數0.025,就是二進位制小數0.001 0 1 2 0 1 4 1 1 8 相當於1 2 的 3次方。所以規定指數字要加上127.eg...