【程序员面试宝典】强制类型转换之面试例题2

题目:

void main()  
{  
     unsigned int a = 0xFFFFFFF7;  
     unsigned char i = (unsigned char)a;  
     char* b = (char*)&a;  
   
     printf("%08x, %08x\n", i, *b);  
}  

 

输出:

000000f7, fffffff7

(1)i的输出的解释:

unsigned char仅占一个字节,对int型的a进行截断。

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。

小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;

大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

基于X86平台的PC机是小端字节序的

基于以上理论可知,截断时,i会获得低字节数据F7。由于是无符号的,要求输出8位,则填充为000000F7才输出。

(2)*b的解释:

指针类型的转换,而非char类型的转换。

先看下面一个例子:

unsigned int a = 0XAAAAAAA7;
unsigned char i = (unsigned char)a;
char * b = (char*)&a;
unsigned char* c = (unsigned char*)&a;
printf("%08x, %08x, %08x, %08x\n", a, i, *b, *c);
printf("%x, %x, %x, %x\n", a, i, *b, *c);


输出:

可见,输出与前六位无关,说明发生了截断。

具体解释如下:

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

所以 现在b指向的是0xf7, 这是一个负数,使用%08x 输出 就是ffffffff7.

 

参考:

http://blog.csdn.net/zhanghenglei/article/details/7330365

http://www.cppblog.com/aaxron/archive/2011/02/28/140786.aspx

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2012/08/26/4767315.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值