#include <stdio.h>
void main(void){
unsigned int a = 0xFFFFFFF7;
unsigned char i = (unsigned char)a;
char *b = (char *)&a;
printf("%08x,%08x", i, *b);
}
有一道面试题是这样的,正确的答案是:000000f7,fffffff7
为什么是这个样子呢,我们来看看他编译后的汇编代码
①unsigned char i = (unsigned char)a;
汇编的实现过程是,把a变量的值的低8位赋值给i,所以在这里i=0xF7
②char *b = (char *)&a;
这里是取得a的地址的值后将该值强制转换类型为char *,由于char *和int *都是4字节,所以这里没有任何数据丢失,b和&都指向值为变量a的第一个字节
③printf("%08x,%08x", i, *b);
这里是最关键的地方,我一开始也怀疑输出结果为什么不是000000f7,000000f7
经过测试后发现,当printf后面传递的每个参数的长度若少于4个字节,会被强制赋值给一