某论坛有人提出以下问题:
 
#include <iostream>  using namespace std;  int main()  {      unsigned int a = 0x000000f7;      unsigned int *p = &a;      char *b = (char *)&a;      printf("x/n",*p);      printf("x",*b);      return 0;  }    问:为什么*p,*b的输出结果不一样,若把a改为0x00000017,则输出结果一样。。。
 
我的解答:
 
根本原因,符号位扩展。
 
 
 
更详细点,可以概括为以下两点:
 
(1)32位cpu的栈是4字节对齐的,所以任何小于4字节的数据圧栈都要转化为4字节压入。所以,这就有了字节扩展的可能。关于字节扩展,有符号数的编译器以符号位扩展,无符号的以0扩展高位。
 
(2)printf是含有不定参数的。那么,这个函数如何确定自己本身有多少参数呢?其实奥秘就在与最前面的字串"x",对这个字串进行扫描,就可以确定后面有多少个参数,但参数的字节则无法确定,所以,取出来的数据必然是32位的,然后经过相应的处理输出结果。