2013-04-26 63 views
2

我試圖尋找一個代碼,以確定該系統的字節序,這是我發現:代碼找到字節序指針類型轉換

int main() 
{ 
    unsigned int i= 1; 
    char *c = (char *)&i; 
    if (*c) { 
     printf("Little Endian\n"); 
    } else { 
     printf("Big Endian\n"); 
    } 
} 

有人能告訴我這個代碼是如何工作的?更具體地講,爲什麼在這裏符號需要在這一類型轉換:

char *c = (char *)&i; 

什麼是越來越存入指針ç..我包含值或者我被包含在實際的地址?此外,爲什麼這是這個程序的字符?

+6

uuhhh,這是行不通的。然而,它會工作,如果'我'被分配到1我認爲... – David 2013-04-26 02:55:45

+0

@Dave我也有點懷疑,但是我再也不真正瞭解一些黑魔法人的想法。 – michaelb958 2013-04-26 02:57:45

+6

Endian,而不是印度 – franji1 2013-04-26 02:59:07

回答

10

雖然解引用字符指針,只有一個字節被解釋(假設一個char變量取一個字節)。而在little-endian模式,一個整數的least-significant-byte存儲first.So爲4字節整數,比如3,而對於big-endian模式被存儲,因爲它被存儲爲

00000011 00000000 00000000 00000000 

00000000 00000000 00000000 00000011 

因此,在第一種情況下,所述char*解釋的第一個字節,並顯示3,但在第二種情況下,它顯示0

如果你不是一個類型強制轉換它:

char *c = (char *)&i; 

它會顯示一個關於不兼容的指針警告type.Had c是一個integer pointer,提領它會得到一個整數值3不管字節序的,因爲所有4字節將被解釋。

NB您需要初始化變量i以查看整個圖片。在默認情況下,不要將垃圾值存儲在變量中。

警告! OP,我們討論little-endianbig-endian之間的差別,但要知道little-endianlittle-indian。我注意到,您使用的latter.Well,所不同的是little-indian可以花費你在谷歌或你夢想的工作之間的區別是很重要$ 300萬的風險投資,如果你的面試官是Nikesh Arora,Sundar Pichai,Vinod Dham or Vinod Khosla :-)

+1

我的不好,我從一個網站複製它,並沒有仔細看過這一切..我是對類型轉換比對printf中寫入的內容更感興趣。不過,請糾正它,謝謝! – Floose 2013-04-26 03:59:29

+0

@Floose嘿,我只是在開玩笑。這只是一個無辜的拼寫錯誤,並不意味着這個程序太多! – 2013-04-26 04:00:29

4

讓我們嘗試通過這一走:(在評論)

int main(void){/
    unsigned int i = 1; // i is an int in memory that can be conceptualized as 
         // int[0x00 00 00 01] 

    char *c = *(char *)&i; // We take the address of i and then cast it to a char pointer 
         // which we then dereference. This cast from int(4 bytes) 
         // to char(1 byte) results in only keeping the lowest byte by 
    if(*c){    // Endian-ness. 
    puts("little!\n"); // This means that on a Little Endian machine, 0x01 will be 
    } else {    // the byte kept, but on a Big Endian machine, 0x00 is kept. 
    puts("big!\n");  // int[0x00 00 00 (char)[01]] vs int[0x01 00 00 (char)[00]] 
    } 

    return 0; 
} 
+1

嘿,非常感謝您的回覆。不幸的是,我只能將一個答案標記爲正確,所以這裏是我感謝您的幫助。我現在很清楚。給你一個upvote :) – Floose 2013-04-26 03:58:18

+1

描述是不準確的 - 沒有「downcasting」(該術語是指非常具體的東西;請不要像這樣超載)。 '&i'符號取變量'i'的地址:即它給你一個指向'unsigned int'的指針。然後,您將該指針轉換爲指向'char'的指針。 if語句中的* c *將引用該字符指針,根據代碼運行平臺的字節順序返回整數的LSB或MSB。 – 2013-04-26 04:06:22

+0

我的歉意@Nik Bougalis,我修改了我的答案。 – GRAYgoose124 2013-04-26 13:09:32