我无法弄清楚下面的代码如何产生输出为ffffffaa请帮我理解?
您好我无法弄清楚下面的代码是如何产生 输出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