浮點數相關

2021-09-30 08:24:11 字數 693 閱讀 2042

4、下面的程式會輸出什麼?

#include

int main()

參***:該項程式輸出如下所示, 0 12 1095237632 原因是:浮點數是4個位元組,12.5f 轉成二進位制是:01000001010010000000000000000000,十六進製制是:0x41480000,十進位制是:1095237632。所以,第二和第三個輸出相信大家也知道是為什麼了。而對於第乙個,為什麼會輸出0,我們需要了解一下float和double的記憶體布局,如下:

float: 1位符號位(s)、8位指數(e),23位尾數(m,共32位)

double: 1位符號位(s)、11位指數(e),52位尾數(m,共64位)

然後,我們還需要了解一下printf由於型別不匹配,所以,會把float直接轉成double,注意,12.5的float和double的記憶體二進位制完全不一樣。別忘了在x86晶元下使用是的反位元組序,高位位元組和低位字位要反過來。所以:

float版:0x41480000 (在記憶體中是:00 00 48 41)

double版:0x4029000000000000 (在記憶體中是:00 00 00 00 00 00 29 40)

而我們的%d要求是乙個4位元組的int,對於double的記憶體布局,我們可以看到前四個位元組是00,所以輸出自然是0了。 這個示例向我們說明printf並不是型別安全的,這就是為什麼c++要引如cout的原因了。

浮點數相關

剛剛看了別人的部落格裡關於浮點數的講解,我用通俗的話總結一下 以浮點數9.0為例子,用二進位制表示為1001.0,科學記數公式為 1 num 1 s m 2 e s表示符號,e表示階乘,m表示有效數字 簡單來說就是s填0或者1來決定正負,e表示小數點要移位的次數,m表示1.001也就是有效數字,基本...

浮點數相關

浮點數 float,double 精度問題與巨集定義 define float 單精度 double 雙精度 位元組 4 8 32位 64位 float型別所占用4個位元組則會有32位,而在儲存時,系統會將實型資料分成小數部分和指數二個部分來儲存。由於小數也存在正負,最前面的單獨一位來表示符號位。0...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...