double x = 12.5; printf(“%d\n”,x);

來源:互聯網
上載者:User

#include <stdio.h>int main(){double x = 12.5;printf("%d\n",x);int y = 10;printf("%lf\n",y);}

輸出:

0
0.000000

float x = 12.5;

printf("%d\n", x);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的原因了。

#include <iostream>#include <cstdio>using namespace std;int main(){int x = 1;printf("%d\n", x);return 0;}
  符號位 指數位 小數部分 指數位移量
單精確度浮點數 1 位[31] 8位 [30-23] 23位 [22-00] 127
雙精確度浮點數 1 位[63] 11 位[62-52] 52 位[51-00] 1023

int i=2;

4個位元組就是 00000000 00000000 00000000 00000010
然後根據你的printf 格式,
float 解析:
高位0表示正數,
指數8位都是0, 那麼就是 -127 次方, 然後...尾數已經不用考慮了 ~

-127 次方,
得到的結果基本是 0,
以float 6-7 位的精度,
顯然得到的結果是 0 ...
(2 的-127 次方, 估計得接近40位小數才有非0值出現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.