您好我無法弄清楚下面的代碼是如何產生 輸出ffffffaa 請幫助我理解我無法弄清楚下面的代碼如何產生輸出爲ffffffaa請幫我理解?
#include<stdio.h>
int main()
{
int a=0xaaaaaaaa;
char *p=(char*)&a;
printf("%x\n",*p);
}
您好我無法弄清楚下面的代碼是如何產生 輸出ffffffaa 請幫助我理解我無法弄清楚下面的代碼如何產生輸出爲ffffffaa請幫我理解?
#include<stdio.h>
int main()
{
int a=0xaaaaaaaa;
char *p=(char*)&a;
printf("%x\n",*p);
}
可變參數的功能,如printf
在其尾部參數進行默認參數推廣。 A char
被提升爲int
,並且當在該平臺上簽名char
時,執行簽名擴展。
要避免該符號擴展名使用unsigned char
類型或在您的程序的printf
調用中投上*p
至unsigned char
。
我無法弄清楚上面的代碼如何生成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
,但打印格式說明符%x
的unsigned int
的十六進制表示。這是一個很好的事情int
和unsigned 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");
}
不同的編譯器可產生相同的機器上的不同的輸出。
你有'#include'嗎? 'int a = 0xaaaaaaaa;'會爲'a'分配一個實現定義的值(除非你的系統上的int大於32位);使用'unsigned int'會更清晰。你問題中的代碼不能產生你描述的輸出('%d'打印十進制,而不是十六進制);請更新您的問題以顯示您正在運行的實際代碼。 –
2015-02-23 21:12:03