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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载——C语言中float,double类型,在内存中的结构(存储方式)

發布時間:2025/7/25 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载——C语言中float,double类型,在内存中的结构(存储方式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在做一個數據格式分析和轉換的項目,第一次接觸底層的二進制代碼存儲,看的一頭霧水,看到這個帖子后對于在Windows系統下數據的存儲方式有了更多的了解,將原文分享一下:

原文地址為http://www.cppblog.com/aaxron/archive/2011/12/03/161347.html

C語言中float,double類型,在內存中的結構(存儲方式)
從存儲結構和算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能存儲更高的精度。

任何數據在內存中都是以二進制(0或1)順序存儲的,每一個1或0被稱為1位,而在x86CPU上一個字節是8位。比如一個16位(2 字節)的short int型變量的值是1000,那么它的二進制表達就是:00000011 11101000。由于Intel CPU的架構原因,它是按字節倒 序存儲的,那么就因該是這樣:11101000 00000011,這就是定點數1000在內存中的結構。

目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。

這種結構是一種科學計數法,用符號、指數和 尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。

下面是具體的規格:

類型????? 符號位 階碼? 尾數? 長度?
float?????? 1????? 8???? 23??? 32?
double??? 1???? 11??? 52??? 64?
臨時數???? 1???? 15??? 64??? 80

由于通常C編譯器默認浮點數是double型的,下面以double為例: 共計64位,折合8字節。

由最高到最低位分別是第63、62、61、……、0位: 最高位63位是符號位,1表示該數為負,0正; 62-52位,一共11位是指數位; 51-0位,一共52位是尾數位。

按照IEEE浮點數表示法,下面將把double型浮點數38414.4轉換為十六進制代碼。

把整數部和小數部分開處理:整數部直接化十六進制:960E。小數的處理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:最高位的1 不寫入內存)。

如果你夠耐心,手工算到53位那么因該是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)

科學記數法為:1.001……乘以2的15次方。指數為15! 于是來看階碼,一共11位,可以表示范圍是-1024 ~ 1023。因為指數可以為負,為了便于計算,規定都先加上1023,在這里, 15+1023=1038。

二進制表示為:100 00001110 符號位:正—— 0 ! 合在一起(尾數二進制最高位的1不要): 01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101 按字節倒序存儲的十六進制數就是: 55 55 55 55 CD C1 E2 40。

轉載于:https://www.cnblogs.com/madhenry/archive/2012/06/25/2561607.html

總結

以上是生活随笔為你收集整理的转载——C语言中float,double类型,在内存中的结构(存储方式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。