2014-10-11 47 views
2
#include<stdio.h> 
int main()                                
{ 
    unsigned int unum = 0x80008001; 
    short unsigned int *snum = (short unsigned int*)&unum; 
    printf("%d\n", *snum); 
    printf("%d\n", *(snum+1)); 
    return 0; 
} 

輸出:這段代碼是否真的知道系統是小端還是大端?

32769 
32768 

SNUM所指向的UNUM的初始兩個字節,但它的值是UNUM的最後兩個字節,並且遞增指針後,值的前兩個字節UNUM。

所以,這是一個小端系統。 但是,我不確定這種方式是正確的還是不知道系統的類型。 這是正確的嗎?

+1

C++答案:否則會出現無法編譯,也許? – 2014-10-11 12:44:45

+3

明顯嚴格的鋸齒違規是顯而易見的。 – 2014-10-11 12:45:30

+0

@HotLicks:不是我如何閱讀它。第一個數字是低部分,對不對? – 2014-10-11 12:45:39

回答

5

由於違反了嚴格的別名規則(C標準​​爲6.5/7,C++爲[basic.lval]/10),您的代碼會導致未定義的行爲。代碼通過完全不同類型的左值訪問存儲的值unum。使用C++編譯器,上面的代碼甚至不會編譯,因爲不相關的指針類型之間的隱式轉換被禁止。

使用charunsigned char別名從對象表示中訪問單個字節,這些類型將從嚴格別名規則中排除。 Here就是例子。

1

對我來說,你提交的代碼不會編譯,因此我會認爲你不能這樣做。但是this post顯示瞭如何解決您正在討論的問題。

我的編譯器:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
+0

不要假設並更新編譯器。 – JagsVG 2014-10-11 13:07:17

+0

我不會說我的編譯器是舊的。回答更新 – lisu 2014-10-11 13:09:08

+0

對我來說,代碼在ubuntu 12.04上用gcc 4.6.3編譯得很好。 – JagsVG 2014-10-11 13:10:27

相關問題