【发布时间】:2013-09-03 07:16:09
【问题描述】:
我正在玩一些代码:
int n;
char *ptr;
scanf("%d",&n);
ptr = (char *) &n; // pointer to the integer
printf("\na[0]=%p",*ptr); // print the values at the next 4 memory locations
printf("\na[1]=%p",*(ptr+1));
printf("\na[2]=%p",*(ptr+2));
printf("\na[3]=%p",*(ptr+3));
这段代码给了我一个干净的输出
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
对于 VisualC++ '12 中 win32 设置的输入 -1。
但是,当我为 x64 架构编译此代码时,我得到 -
00000000FFFFFFFF
00000000FFFFFFFF
00000000FFFFFFFF
00000000FFFFFFFF
对于相同的输入值-1。两种架构的整数大小相同。 我的问题是为什么 4 个位置的内存布局不都是 F?
【问题讨论】:
-
您在滥用
%p。请改用%x。 -
@cnicutar 这就是重点。如果您使用 %p 在该位置打印内容,您会看到 MSB 填充为 0。
-
%p想要一个void *,而你传递了一个char(被提升为int)。 -
您没有发现打印 a byte 并获得
FFFFF(16 bits) 的问题吗?奶奶,你有多大的字节! -
@Samboy786:
%p需要一个 8 字节的参数,但您传递的是一个 4 字节的参数(因为 char 在可变参数列表中被提升为 int)。从可变参数到格式说明符的“预期类型”没有魔法转换。行为未定义。