欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2025/3/19 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【程序员面试宝典】强制类型转换之面试例题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

总结

以上是生活随笔为你收集整理的【程序员面试宝典】强制类型转换之面试例题2的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。