在程序员面试宝典中看到这样一道题,下面程序的输出结果是什么?
1 #include <stdio.h>
2
3 int main(int argc, char const *argv[])
4 {
5 unsigned int a = 0xfffffff7;
6 unsigned char i = (unsigned char)a;
7
8 char *b = (char *)&a;
9
10 printf("%08x,%08x\n", i, *b);
11 return 0;
12 }
分析:在X86系列的机器中,数据的存储是“小端存储”,小端存储的意思是,对于一个跨多字节的数据,其低位存放在低地址单元,其高位存放在高地址单元。比如一个int型的数据0x12345678,假如存放在0x00000000,0x00000001,0x00000002,0x00000003这四个内存单元中,那么0x00000000中存放的是低位的0x78,而0x00000003中存放的是高位的0x12,依此类推。
分析第二个为什么输出fffffff7. &a可以认为是个指向unsigned int类型数据的指针,(char *)&a把&a强制转换成char *类型的指针,并且这个时候发生了截断!截断后,指针b只指向0xf7这个数据。(为什么 b指向最低位的0xf7而不是最高位的oxff?想想上面刚刚讲过的小端存储