double內存存儲
『壹』 c語言中float和double的區別!
區別:
1、精度不一樣,float是單精度,double是雙精度;
2、表示小數的范圍不一樣,double能表示的范圍比float大;
3、double在內存中,佔8個位元組,float在內存中,佔4個位元組。
float:浮點型數據類型,FLOAT 數據類型用於存儲單精度浮點數或雙精度浮點數。浮點數使用IEEE(電氣和電子工程師協會)格式。浮點類型的單精度值具有 4 個位元組,包括一個符號位、一個 8 位 二進制指數和一個 23 位尾數。由於尾數的高順序位始終為 1,因此它不是以數字形式存儲的。此表示形式為 float 類型提供了一個大約在 -3.4E+38 ~ 3.4E+38 之間的范圍。
double:雙精度浮點型,此數據類型與單精度數據類型(float)相似,但精確度比float高,編譯時所佔的內存空間依不同的編譯器而有所不同,是double float數據類型,C/C++中表示實型變數的一種變數類型。
(1)double內存存儲擴展閱讀:
浮點型數據
1、float型
編譯系統為每一個float型變數分配4個位元組,數值以規范化的二進制數指數形式存放在存儲單元中。
2、double型
為了擴大能表示的數值范圍,用8個位元組存儲一個double型數據,可以得到15位有效數字。
3、long double型
不同的編譯系統對long double型的處理方法不同,Visual C++6.0對long double型和double一樣處理,分配8個位元組。
網路-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.(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
『叄』 c語言中double和float它們存儲時分別占據多大的內存空間
double 中文譯為雙精度浮點數,一般稱雙精度數,它在內存中佔用8個位元組(位、bit)的空間;float 中文譯為單精度浮點數,一般就稱為浮點數,它在內存中佔用4個位元組的空間。
『肆』 double型數據在內存中是怎麼存儲的
表示分配的內存的存儲數據的類型!這決定了分配內存的實際大小!因為不同類型的數據在內存中所佔據的空間是不同的!
『伍』 double類型的數據是怎樣分配到內存中的呢
立刻動手寫一小段測試代碼就知道了:
int main(int argc, char ** argv)
{
int i;
double x = 123456789.123456789;
unsigned char* ptr = (unsigned char*)&x;
for(i=0; i<sizeof(x); i++)
printf("%02X ", ptr[i] );
printf("\n");
int y = 0x1234;
ptr = (unsigned char*)&y;
for(i=0; i<sizeof(y); i++)
printf("%02X ", ptr[i] );
printf("\n");
return 0;
}
我的系統(X86CPU, RedHat FC,G++編譯器)輸出的結果是:
75 6B 7E 54 34 6F 9D 41
34 12 00 00
容易看得出來,整數0x1234使用4位元組(0x34 0x12 0x00 0x00)內存表示,但是double的8位元組就很難一眼看明白了。
為什麼呢?因為浮點數在計算機中不像整數那樣簡單的使用數值表示,它使用的是科學計數法,通常由正負符號、數字、冪3部分組成,因此它可以表示很大數或者很小的數,但其精度是有限的,比如float只有6位數字的精度,而double一般也只有10位數字精度。
至於一個在內存中佔8位元組64位的浮點數,哪幾位表示數字,哪幾位表示冪,完全取決於編譯器的實現,很可能MS VC的結果就和上面的不同。
指針和內存一直都是C或者C++較難的地方,因為這部分內容和計算機體系以及編譯器的實現都有關系,就拿上面最簡單的整數0x1234來說,在其他體系的計算機中,很可能是以0x00 0x00 0x12 0x34來表示的(在socket通信中經常碰到這種情況,樓主如果好奇可以按關鍵字"網路位元組序"搜搜)
『陸』 c語言中double和float它們存儲時分別占據多大的內存空間
double
中文譯為雙精度浮點數,一般稱雙精度數,它在內存中佔用8個位元組(位、bit)的空間;float
中文譯為單精度浮點數,一般就稱為浮點數,它在內存中佔用4個位元組的空間。
『柒』 C語言中DOUBLE型數據儲存結果
float與double類型的內存分布,精度和范圍
內存分布:
C/c++的浮點數據類型有float和double兩種。
float大小為4位元組,內存中的存儲方式如下:
符號位(1bit)指數(8bit)尾數(23bit)
double大小為8位元組,內存中的存儲方式如下:
符號位(1bit)指數(11bit)尾數(52bit)
符號位決定浮點數的正負,0正1負。指數和尾數均從浮點數的二進制科學計數形式中獲取。
如,十進制浮點數2.5的二進制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1)。
由此可知指數為1,尾數(即科學計數法的小數部分)為01。
根據浮點數的存儲標准,指數用移碼表示。0的float類型移碼為127(0111 1111),0的double類型移碼為1023(011 1111 1111)。運算時,在0 的移碼基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。
所以float和 double類型分別表示的2.5如下(二進制):
符號位 指數 尾數
0 1000 0000 010 0000 0000 0000 0000 0000
0 100 0000 0000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
精度:
float和double的精度是由尾數的位數來決定的。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字; double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
范圍:
float類的指數是8位移碼,最大為127最小為-127,127用來作2的指數,為2^127,約等於 1.7014*10^38, 而我們知道,floa示數范圍約為- 3.4*10^38-------3.4*10^38, 這是因為尾數都為1時,即1.11..11約為2,因此浮點數的范圍就出來了.double的情況與float完全相似.
『捌』 能不能給我講講C語言中實數的二進制形式,是怎樣存儲的
1、float類型數字在計算機中用4個位元組(32位)存儲。
遵循IEEE-754格式標准:
一個浮點數由3部分組成:符號位s(1位)和、指數e(8位)、底數m(23位)
2、格式
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S:符號位
E:指數,十進制指數加上127後的值得二進制數據
M:底數
3、符號位
指底數的符號,可正可負。
4、指數
佔用8bit的二進制數,可表示數值范圍為0-255。
但是指數可正可負,所以,IEEE規定,此處算出的次方必須減去127才是真正的指數。
所以,float類型的指數可從-126到128
5、底數
實際是佔用24bit的一個值,但是最高位始終為1,所以,最高位省去不存儲,在存儲中佔23bit
科學計數法。
再舉一例:
17.625在內存中的存儲
首先要把17.625換算成二進制:10001.101
在將10001.101右移,直到小數點前只剩1位:
1.0001101 * 2^4 因為右移動了四位
底數:因為小數點前必為1,所以IEEE規定只記錄小數點後的就好。所以,此處的底數為:0001101
指數:實際為4,必須加上127(轉出的時候,減去127),所以為131。也就是10000011
符號:整數,所以是0
綜上所述,17.625在內存中的存儲格式是:
01000001 10001101 00000000 00000000
『玖』 c語言中double型數據在內存中 佔多少個位元組來存儲
c語言中double(雙精度浮點型)是計算機使用的一種數據類型。double(雙精度浮點型)使用 64 位(8位元組) 來儲存一個浮點數。 它可以表示十進制的15或16位有效數字,其數值范圍為-1.79769313486232E308 到1.79769313486232E308。
(9)double內存存儲擴展閱讀:
double(雙精度浮點型)數值可轉換到其他類型的整數或浮點數,反之亦然。double(雙精度浮點型)常量的最後一個字元可加上「d」或「D」。其存儲格式與浮點型類似,最高位為符號位,次高11位為指數位,其次52位為尾數。
double(雙精度浮點型)同數值型比,它能提供更高的數值精度,採用固定存儲長度的浮點數形式,與數值型數據不同,它的小數點位置是由輸入的數據值來決定的,並且只能用於表中的欄位。
『拾』 C語言中DOUBLE型數據儲存結果
float與double類型的內存分布,精度和范圍
內存分布:
C/c++的浮點數據類型有float和double兩種。
float大小為4位元組,內存中的存儲方式如下:
符號位(1bit)指數(8bit)尾數(23bit)
double大小為8位元組,內存中的存儲方式如下:
符號位(1bit)指數(11bit)尾數(52bit)
符號位決定浮點數的正負,0正1負。指數和尾數均從浮點數的二進制科學計數形式中獲取。
如,十進制浮點數2.5的二進制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1)。
由此可知指數為1,尾數(即科學計數法的小數部分)為01。
根據浮點數的存儲標准,指數用移碼表示。0的float類型移碼為127(0111
1111),0的double類型移碼為1023(011
1111
1111)。運算時,在0
的移碼基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。
所以float和
double類型分別表示的2.5如下(二進制):
符號位
指數
尾數
0
1000
0000
010
0000
0000
0000
0000
0000
0
100
0000
0000
0100
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
精度:
float和double的精度是由尾數的位數來決定的。
float:2^23
=
8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
double:2^52
=
4503599627370496,一共16位,同理,double的精度為15~16位。
范圍:
float類的指數是8位移碼,最大為127最小為-127,127用來作2的指數,為2^127,約等於
1.7014*10^38,
而我們知道,floa示數范圍約為-
3.4*10^38-------3.4*10^38,
這是因為尾數都為1時,即1.11..11約為2,因此浮點數的范圍就出來了.double的情況與float完全相似.