秋林箭

每夜,携酒河上,饮且渔

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
1 void main()    
2  {    
3     unsigned int a = 0xFFFFFFF7;    
4     unsigned char i = (unsigned char)a;    
5     char* b = (char*)&a;    
6      
7     printf("%08x, %08x\n", i, *b);    
8  }  
 

输出:000000f7, fffffff7

unsigned int到unsigned char直接截断,取低字节。

(char*)&a 将a的地址转换成一个char型指针,和(int*)&a 转换成一个int是不同,它只会指向&a的低8位内存,其余的发生了截断。

所以unsigned int a = 0xFFFFFFF7; 改为unsigned int a = 0x1FFFFFF7; 输出等等*b还是fffffff7。现在b指向的是0xf7, 这是一个负数,使用%08x 输出 就是ffffffff7.因为数据在计算机中都是以补码形式存在的,正数进行位扩展的话是零扩展,负数进行位扩展的话是符号扩展,即在符号位后不足的位数补上最高有效位的值。

 

posted on 2015-07-02 21:34  zhangyee  阅读(136)  评论(0编辑  收藏  举报