2014-10-02 89 views
2

的我有以下程序在C:指針陣列輸出

main() { 
    int arr[5]={100,200,300}; 
    int *ptr1=arr; 
    char *ptr2=(char *)arr; 
    printf("%d\n",sizeof(int)); 
    printf("%d %d",*(ptr1+2),*(ptr2+4)); 
    return 0; 
} 

其輸出如下:

4 
300 -56 

請說明最後的輸出。根據我的理解,最後的輸出應該是44而不是-56。

+4

爲什麼你認爲它應該是'44'? – 2014-10-02 11:32:29

+3

這取決於'endianness' – Abhi 2014-10-02 11:34:44

+0

好吧,我已經在編譯器中運行它,其中int是2個字節。在這種情況下,它輸出爲44.那麼它也取決於一個整數需要多少個字節。 – Sarwan 2014-10-02 11:48:27

回答

4

您正在挑選arr[1]的第一個八位字節。你的機器是小端有4個字節int等的4個字節組成arr[1]的,寫成小數:

200, 0, 0, 0 

所以你解釋八位位組200作爲char。您的char已簽名,且您的機器使用two's complement

200的二進制表示是

11001000 

由於最顯著位被置位,這是作爲一個符號值觀察時一個負數。因此,爲了計算負值的大小,我們反轉比特,並添加一個。

00110111 

是十進制的55。因此,輸出值是-56。

+0

人們也可以這樣說,因爲值環繞着,並且char顯然被解釋爲在-128-127的範圍內(由這個特定的編譯器),所以200被解釋爲負值200-256 = -56。 – 2014-10-02 13:11:24

2

事實上,你預計44那會是什麼,如果你有sizeof(int) = 2,因爲那時*(PTR2 +4)將指向300 = 256 + 44的1002E十六進制表示和在2E或44最後一個字節小數。

要單獨得到它的一個int的大小,你應該寫:

printf("%d %d",*(ptr1+2),*(ptr2+(2 + sizeof(int))); 

但它仍然依賴於字節序和大端計算機上給0 ...