2011-02-10 23 views
2

這個程序是決定big endian還是little endian。來自careercup關於endian的一個問題

這是在書中給出了答案:

int Test(){ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    return (byte[0] ? BIG:LITTLE); 
} 

我不明白這行:char *byte = (char *) &word;這是否意味着「傳字的地址爲字節」?那麼,現在字節指向字的原始地址?據我所知,short int是2個字節。那麼,「字節」指向更高的地址還是更低的地址?爲什麼?

這是如何工作的?

+0

_does「字節」點高地址或低地址_這正是測試功能應該確定的內容;它在一些機器上更高,其他機器上更低。 – 2011-02-11 04:37:44

回答

3

它只是將word的地址轉換爲char指針,並將其放入byte

此時,byte將指向2字節word的第一個字節,並且該字節的值(1或0)會告訴您,如果您在大型或小型端機上。

+0

「2字節字的第一個字節」如你所說,你的意思是更高的地址1還是更低的地址1? – 2011-02-10 18:48:48

3

如果我們假設短則2個字節,那麼內存佈局像這樣大端機器上:

 
MSB  LSB 
------------------- 
| 0x0 | 0x1 | 
------------------- 

而且像這樣的小端機

 
MSB  LSB 
------------------- 
| 0x1 | 0x0 | 
------------------- 

。也就是說,短0x0001由2個字節組成,其中一個值爲0,另一個值爲1.在大型機器上,最小有效字節(此處爲0x1)存儲在該短內存地址中,最高有效字節存儲在更高的地址中。在一臺小型機器上,這是相反的。

因此,char *byte = (char *) &word;獲得word的地址並將其解釋爲char *。假設字符是8位,我們現在有一個指向我們短片內最低有效字節的指針。如果這是0x1,則該機器是大端,如上圖所示。如果它是0,它是一個小端機器。

(注意檢查字節序的這種方式可能無法移植 - 例如,有機器,其中一個字符的大小與短相同,並用這種方法許多其他或多或少深奧陷阱)

0

你想通過單字節的步驟來讀取單詞。 所以,你需要一個指向單詞的指針,它一次只能看一個字節。這是一個char *,因爲char是標準定義的1個字節。 然後你將char *指向分配單詞的內存位置,並讀取第一個值(字節[0],你也可以用*字節來解引用它)。 如果是1,這是一個大endian機器:

01 00 

如果它是零,這是一個小端機

00 01