我正在尝试了解以下代码的输出:http: //phrack.org/issues/60/10.html
在这里引用它以供参考:
#include <stdio.h>
int main(void){
int l;
short s;
char c;
l = 0xdeadbeef;
s = l;
c = l;
printf("l = 0x%x (%d bits)\n", l, sizeof(l) * 8);
printf("s = 0x%x (%d bits)\n", s, sizeof(s) * 8);
printf("c = 0x%x (%d bits)\n", c, sizeof(c) * 8);
return 0;
}
我在我的机器上得到的输出是:-
l = 0xdeadbeef (32 bits)
s = 0xffffbeef (16 bits)
c = 0xffffffef (8 bits)
这是我的理解:-
赋值 s=l, c=l 将导致 s 和 c 被提升为整数,它们将分别具有 l 的最后 16 位 (0xbeef) 和最后 8 位 (0xef)。
Printf 尝试将上述每个值(l、s 和 c)解释为无符号整数(因为 %x 作为格式说明符传递)。从输出中我看到符号扩展已经发生。我的疑问是,既然 %x 代表 unsigned int,为什么在打印 s 和 c 时会发生符号扩展?s 的输出不应该是 0x0000beef 而 c 的输出不应该是 0x000000ef 吗?