第七题:
下面代码printf打印的结果是多少?
#include <stdio.h>
int main()
{
unsigned int a = 0xfffffff7;
unsigned char ch = (unsigned char)a;
char* b = (char*)&a;
printf("%08x, %08x\n", ch, *b);
return 0;
}
运行结果:
PS:
1. unsigned int 强制转换成unsigned char会被截断
2. char* b = (char*)&a;这里是指针的转换,这里取决于a的内容,在此处刚好8位全部输出。
第八题:
下面代码printf打印的结果是多少?
#include <stdio.h>
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4 + 1;
printf("%d\n", b);
return 0;
}
答案:250
PS:
b = ~a>>4 + 1执行的顺序是先执行~a,然后执行4+1,然后在执行以为操作(由运算符的优先级决定),另外需要注意的一点是:A5在寄存器的表示是 0000 0000 1010 0101,取反变成 1111 1111 0101 1010,右移5位变成1111 1111 1111 1010(这里的移位是算术移位,带着符号移位),由于是unsigned char类型,只能表示低8位,也就是250。
算术移位:1000 1000右移1位1100 0100(符号位不动,左边补位是补符号位)
逻辑移位:1000 1000右移1位0100 0100(高位直接补0)