首页 > 解决方案 > 在我的 C 代码中需要帮助 - 获得意外的输出

问题描述

#include <stdio.h>

int main()
{
int a = -1;
char *p = &a;
printf("%x, %x",*p, *(p+1));
return 0;
}

output is = ffffffff,ffffffff

我知道有符号整数表示为 ffffffff。

* 预期结果应该只打印一个字符,因为它是 char *

*(p+1) 是多少 ffffffff ?

有什么区别吗

char *p = &a;

char *p;
p = &a;

标签: cpointershex

解决方案


Anint超过一个字节(多少取决于您的系统)。因此int a = -1;将至少 2 个字节(或更多)设置为FF. 现在您创建一个字节指针*p并指向a整数的第一个字节的地址。当您x%对字节使用格式时,该字节将被填充到int.

当您尝试使用 打印您的第二个字节时int*(p+1)也会%x将 的输出填充为ff完整int的。

更新: 该过程称为“符号扩展”,当使用较小的值代替较长的值时,较小的值被“扩展”,如果符号为正,则向左填充零,而如果符号为负,向左填充,以便将字节FF视为 intFFFFFFFF而不是000000FF. 这被认为是 C 的“特征”,因此 -1 仍然是 -1。


推荐阅读