日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ float的内存布局

發(fā)布時間:2023/12/4 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ float的内存布局 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
IEEE754標準中,浮點數(shù)的內(nèi)存布局

以下僅以float(內(nèi)存中占據(jù)4個字節(jié),32bits)來說明,double(8個字節(jié),64bits)同理,只是有細微的差別。

float的內(nèi)存分布

IEEE754規(guī)定,32bit的float在內(nèi)存中是這樣分布的:

符號位(S)階碼(E)尾數(shù)(M)
1823

整數(shù)、浮點數(shù)在內(nèi)存中都是以二進制的形式存在的(補碼),而浮點數(shù)是二進制下的科學計數(shù)法存儲在內(nèi)存中的。可以表示 為:$ s 1.m^e$

  • 符號位占據(jù)一個比特,當S = 0時表示正數(shù),當S = 1時表示負數(shù)。
  • 階碼e則是其指數(shù)再加上一個偏移量(127)后的數(shù),其總共占據(jù)了8個字節(jié),8位無符號數(shù)的范圍是0~255,考慮到已經(jīng)加了一個偏移量,則其實際可表達的范圍是-128~127(這個范圍是指二進制計數(shù)法下的范圍)。
  • 尾數(shù)m占據(jù)了23個字節(jié),由于是使用的二進制下的科學計數(shù)法,所以任何浮點數(shù)(除了0)都隱含了一個1,也就是說,其尾數(shù)實際上在前面應該再加一個1,即:1.m,這樣,浮點數(shù)的二進制精度是24位,而$2^{24} = 16777216$,所以其十進制下的精度是7位有效數(shù)字。
計算實例

1, 十進制與二進制的互轉(zhuǎn)
二進制轉(zhuǎn)十進制比較簡單,就是對應位乘以對應的2的冪次,比如:101.1011,其轉(zhuǎn)換過程為:
$$1*2^2 + 0 * 2^1 + 1 * 2^0 + 1 * 2^{-1} + 0 * 2^{-2} + 1 * 2^{-3} + 1 * 2^{-4}$$
十進制整數(shù)轉(zhuǎn)二進制比較簡單,一是8421來湊,一是除2倒序排,不再解釋。
十進制小數(shù)轉(zhuǎn)二進制,就是一直乘2,如果大于1,則置1,如果小于1,則置0,一直乘2,直到為0或達到指定位數(shù)為止。
比如0.125:
$$ 0.25 * 2 = 0.5 --- 0 \\ 0.5 * 2 = 1 --- 1$$
則其二進制為:0.01。
再比如:0.632:
$$ 0.632 * 2 = 1.264 --- 1 \\ 0.264 * 2 = 0.528 ---0 \\ 0.528 * 2 = 1.056 ---1 \\ 0.056 * 2 = 0.112 ---0 \\ ...$$
則其二進制為:0.1010….。
2, 計算float的內(nèi)存布局
2.1 考慮float fa = 4.25,那么:int ia = *(int*)&fa是多少呢?
我們知道,4.25 = 100.01,化成指數(shù)表示為:$1.0001*2^2$,則其符號位S = 0, 階碼e = 2 + 127 = 0x81,其尾數(shù)部分二進制表示為:1000 1000 0000 0000 0000 0000,總共24位,將尾數(shù)的最高位的1去掉,再與階碼e,符號位S組合后:

符號位(S)階碼(E)尾數(shù)(M)
01000 0001000 1000 0000 0000 0000 0000

合起來就是:
0100 0000 1000 1000 0000 0000 0000 0000,即:ia = 0x40880000。
2.2 再考慮float fa = -0.0125,那到:c++ int ia = *(int*)&fa是多少呢?
-0.0125 = -0.00000011001100110011001100...,轉(zhuǎn)換成指數(shù)為:$-1.10011001100110011001100…*2^{-7}$,則其符號位S = 1,階碼e = -7 + 127 = 0x78,其尾數(shù)部分用二進制表示為:1100 1100 1100 1100 1100 1101,后面的位數(shù)就被四舍五入截斷了,由于最后一位的后一位是1,則向前進1,同樣保留24位,將其最高位的1去掉,再與階碼和符號位組合:

符號位(S)階碼(E)尾數(shù)(M)
10111 1000100 1100 1100 1100 1100 1101

全起來就是:
1011 1100 0100 1100 1100 1100 1100 1101,即:ia = 0xbc4ccccd。

如果將ia轉(zhuǎn)換成fa,則轉(zhuǎn)換過程相反。



來自為知筆記(Wiz)

轉(zhuǎn)載于:https://www.cnblogs.com/beichen2012/p/5756321.html

總結(jié)

以上是生活随笔為你收集整理的C++ float的内存布局的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。