我无法弄清楚下面的代码如何产生输出为ffffffaa请帮我理解?

问题描述:

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

可变参数的功能,如printf在其尾部参数进行默认参数推广。 A char被提升为int,并且当在该平台上签名char时,执行签名扩展。

要避免该符号扩展名使用unsigned char类型或在您的程序的printf调用中投上*punsigned 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,但打印格式说明符%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"); 
} 

不同的编译器可产生相同的机器上的不同的输出。