2014-01-30 40 views
4
void main() { 

     if(-1 > 0U) 
       printf("True\n"); 
     else 
       printf("False\n"); 
} 

它是依賴於處理器(大端/小端)嗎?鑑於此代碼片段,輸出CPU是否依賴?

+2

考慮到編譯器很可能會優化條件,我會說它並不重要。 –

+0

重要嗎? –

+2

-1的存儲方式與2的恭維繫統(我不確定是否有其他現代系統)的字節順序無關(0xFFFFFFFF)(根據值的寬度有更多或更少的F)。 – mah

回答

8

C99 6.3.1.8

[...]。否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,然後用帶符號的整數操作數類型被轉換爲具有無符號整數類型的操作數的類型。

由於intunsigned int具有相同的轉換秩(見6.3.1.1)-1將被轉換爲unsigned int。根據6.3.1.3,轉換結果將爲(-1 + UINT_MAX + 1) % (UINT_MAX + 1)(算術語言),顯然是UINT_MAX,因此大於0

結論是C標準要求(-1 > 0U)爲真。

+0

這是如何回答有關CPU依賴關係的問題?此外,你方便地忘記引用該文本的§3。 – Lundin

+3

@Lundin:通過完全從C標準中獲取行爲,它表明不存在對實現的依賴。 –

+0

+1,最後,正確答案 – Bathsheba

2

一段代碼是Endian的依賴性僅當它使用指針,其類型爲在尺寸上比的x類型更小的訪問變量x

例如:

int x = 0x12345678; 
char* p = (char*)&x; 
char c = p[0]; // 0x12 on BE and 0x78 on LE 

請注意強調「只在」,在反對「當且僅當」

因此,一些例子可能仍然工作在相同的上和LE:

struct s {int a; int b;} x = {0x11223344,0x55667788}; 
int* p = (int*)&x; 
int i = p[0]; // 0x11223344 in both cases 

注:

位字段結構可用於不同的BE及LE進行編譯。

但是這可以被稱爲編譯器依賴性而不是作爲架構依賴性。

+0

工會也暴露了排序。 –