看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...