2015-02-23 107 views
-1

您好我無法弄清楚下面的代碼是如何產生 輸出ffffffaa 請幫助我理解我無法弄清楚下面的代碼如何產生輸出爲ffffffaa請幫我理解?

#include<stdio.h> 
int main() 
{ 
    int a=0xaaaaaaaa; 
    char *p=(char*)&a; 
    printf("%x\n",*p); 
} 
+1

你有'#include '嗎? 'int a = 0xaaaaaaaa;'會爲'a'分配一個實現定義的值(除非你的系統上的int大於32位);使用'unsigned int'會更清晰。你問題中的代碼不能產生你描述的輸出('%d'打印十進制,而不是十六進制);請更新您的問題以顯示您正在運行的實際代碼。 – 2015-02-23 21:12:03

回答

5

可變參數的功能,如printf在其尾部參數進行默認參數推廣。 A char被提升爲int,並且當在該平臺上簽名char時,執行簽名擴展。

要避免該符號擴展名使用unsigned char類型或在您的程序的printf調用中投上*punsigned char

1

我無法弄清楚上面的代碼如何生成ffffffaa,因爲它不能通過"%d"說明符來處理;-)。

你可能錯誤地輸入你的代碼示例,它應該閱讀:

int main() { 
    int a=0xaaaaaaaa; 
    char *p=(char*)&a; 
    printf("%x\n",*p); 
} 

爲使該代碼產生ffffffaa,字符必須是8位有符號,和INT必須存放在小尾數順序或有大小最多32位。

&a是內存中第一個字節a的地址。將此地址解引用爲char *加載一個字節,並將其作爲int加以擴展,然後將其傳遞到printf,因爲此函數是可變參數。將類型小​​於int的變種函數的額外參數提升爲int並按原樣傳遞,並將小於double的浮點類型提升爲double,並按原樣傳遞。 printf收到int,但打印格式說明符%xunsigned int的十六進制表示。這是一個很好的事情intunsigned int傳遞同樣的方式;-)

因爲值0xaaaaaaaa在小端和大端順序相同的表示,你的代碼將不依賴於字節序只要int爲32位或減。但是在大端順序爲64位int(例如某些晚期的PowerPC)的機器上,a的實際內存佈局將爲00 00 00 00 aa aa aa aa。您的代碼將生成0輸出。

您可以瞭解與該代碼示例端標記:如果它們靶向不同的體系結構(32比64位)

#include <stdio.h>  
int main(void) { 
    int i, a = 0x12345678; 
    unsigned char *p = (unsigned char *)&a; 
    printf("Memory layout for %x is:", a); 
    for (i = 0; i < (int)sizeof(a); i++) 
     printf(" %02x", p[i]); 
    printf("\n"); 
} 

不同的編譯器可產生相同的機器上的不同的輸出。

相關問題