天天看點

c語言在記憶體存儲結構,C語言中float,double類型,在記憶體中的結構(存儲方式)

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