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。
Java語言中:float、double資料類型在記憶體中是如何存儲的
引用參考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/arti ...
C++中将string類型轉換為int, float, double類型 主要通過以下幾種方式:
C++中将string類型轉換為int, float, double類型 主要通過以下幾種方式: # 方法一: 使用stringstream stringstream在int或float類型轉換為 ...
【轉】float類型在記憶體中的表示
http://www.cnblogs.com/onedime/archive/2012/11/19/2778130.html http://blog.csdn.net/adream307/articl ...
C# CLR via 對象記憶體中堆的存儲【類型對象指針、同步塊索引】
最近在看書,看到了對象在記憶體中的存儲方式. 講到了對象存儲在記憶體堆中,配置設定的空間除了類型對象的成員所需的記憶體量,還有額外的成員(類型對象指針. 同步塊索引 ),看到這個我就有點不懂了,不知道類型對象指 ...
java對象在記憶體中的結構
在HotspotJVM中,32位機器下,Integer對象的大小是int的幾倍? 我們都知道在java語言規範已經規定了int的大小是4個位元組,那麼Integer對象的大小是多少呢?要知道一個對象的大 ...
java對象在記憶體中的結構(HotSpot虛拟機)
一.對象的記憶體布局 HotSpot虛拟機中,對象在記憶體中存儲的布局可以分為三塊區域:對象頭(Header).執行個體資料(Instance Data)和對齊填充(Padding). 從上面的這張圖裡面可以 ...
@清晰掉 C++ 中的 enum 結構在記憶體中是怎麼存儲的?
C++ 中的 enum 結構在記憶體中是怎麼存儲的? C++ C++ 中的 enum 結構在記憶體中是怎麼存儲的?裡面存儲的是常量值嗎? 關于占用記憶體的大小,enum類型本身是不占記憶體的,編譯器直接 ...
c語言中float、double、long double在記憶體中存儲方式
存儲格式中的二機制轉為浮點數: 浮點型變量在計算機記憶體中占用4個位元組(4 Byte),即32-bit,一個浮點數由2部分組成:底數m 和 指數e: 底數部分:使用2進制數來表示此浮點數的實際值: 指 ...
浮點型 float和double類型的記憶體結構和精度問題
首先引用一個例子在java中可能你會遇到這樣的問題: 例:0.99999999f==1f //true 0.9999999f==1f //false 這是超出精度造成的,為了知道為什麼會造成這樣的問題 ...
随機推薦
手把手教你使用PS切圖
http://blog.csdn.net/jiangwei0910410003/article/details/41627565
mysql存儲emoji表情
微信擷取的使用者昵稱nickname中帶有emoji表情,轉換成字元碼後是這種形式“\xF0\x9F\x91\x8D\xE6\x94...”, 直接儲存可能出現以下錯誤 Caused by: java. ...
StringBuffer
1.StringBuffer StringBuffer類和String一樣,也用來代表字元串,隻是由于StringBuffer的内部實作方式和String不同,是以StringBuffer在進行字元串 ...
解決ajax的parsererror錯誤的終極辦法(背景傳給前台的資料json問題)
解決ajax的parsererror錯誤的終極辦法(背景傳給前台的資料json問題) 出現這個問題的原因是因為背景傳給前台的資料出現了問題,ajax對于json的格式特别的嚴格 下面是會出現這個問題的 ...
SpringBoot內建前端模版(thymeleaf)
1.在application.properties配置檔案中添加 thymeleaf 的配置資訊 spring.datasource.driverClassName=com.mysql.jdbc.Dr ...
ubuntu_virtualenv
sudo pip install virtualenv 1.安裝virtualenv(需要先安裝pip): $ [sudo] pip install virtualenv 2.建立虛拟環境: $ vi ...
Java注解 架構開發之Java注解的妙用
原文出處: locality 注解的好處: 1.能夠讀懂别人寫的代碼,特别是架構相關的代碼. 2.本來可能需要很多配置檔案,需要很多邏輯才能實作的内容,就可以使用一個或者多個注解來替代,這樣就使得程式設計 ...
Keepalived stable tarball
Keepalived stable tarball Keepalived for Linux - Version 1.3.5 - March 19, 2017 Keepalived for Linux ...
Webstorm實時編譯SASS和LESS
Webstorm自帶一個File Watchers功能,設定一下,即可實時編譯SASS,LESS等 菜單:File->Settings->左欄Tools下的File Watchers,按右 ...
Java IO 修改檔案名
public void renam ...