2013-02-25 126 views
1

我很無聊,想看看double的二進制表示是什麼樣子。但是,我注意到窗戶上有些奇怪的東西。以下幾行代碼演示雙數的二進制表示

double number = 1; 
unsigned long num = *(unsigned long *) &number; 
cout << num << endl; 

在我的Macbook上,這給了我一個非零數字。在我的Windows機器上,它給了我0.

我期待它會給我一個非零數字,因爲1.0的二進制表示形式不應該是全零。但是,我不確定我想要做的是明確定義的行爲。

我的問題是,上面的代碼只是愚蠢和錯誤?而且,有沒有辦法打印出double的二進制表示?

謝謝。

+0

只是可以肯定,這是英特爾的MacBook?無論如何,通過在兩臺機器/編譯器上打印sizeof(unsigned long)的值來驗證。無論如何,爲了可靠的結果,轉換爲char指針並執行十六進制轉儲以查看字節。 – hyde 2013-02-25 22:13:38

+0

退房http://babbage.cs.qc.cuny.edu/IEEE-754/ – 2013-02-25 22:14:24

回答

5

1雙是3ff0 0000 0000 0000long4 byte int。在little endian硬件上,您正在閱讀0000 0000部分。

+2

微軟編譯器中的「long」是32位的。但是如果操作系統是64位的話,'long'是Linux/MacOS上的64位值。這也可以解釋區別... – 2013-02-25 23:24:32

2

如果你的編譯器支持它(GCC),然後使用聯合。這根據C++標準(嚴格別名規則)是未定義的行爲:

#include <iostream> 
int main() { 
    union { 
     unsigned long long num; 
     double fp; 
    } pun; 

    pun.fp = 1.0; 
    std::cout << std::hex << pun.num << std::endl; 
} 

輸出是

3ff0000000000000