首页 > 其他 > 详细

a interview question(1)

时间:2016-01-19 12:08:59      阅读:193      评论:0      收藏:0      [点我收藏+]

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

以下是英文翻译:

warnning: Copyright!you can‘t reprint this blog when you not get blogger‘s  permission.

It is a very excellent interview question that concludes serveal important knowledge which explain how to correctly use printf( ) function that come from  C language standard library.

 1 #include <stdio.h>
 2 
 3 int main ( )
 4 
 5 {    unsigned int a=0xfffffff7; 
 6 
 7     unsigned char i=(unsigned char)a; 
 8 
 9     char *b=(char*)&a;   
10 
11     printf("x,%x\n",i,*b); 
12 
13 }

The main function just conclude four statements. ?The frist statement declare a unsigned integer variable that is assigned as 0xfffffff7.The secend statement means unsigned integer variable,a is assigned to unsigned character variable, i ,but the way of this conservation cause a significant problem which is called as "Byte truncation". The third statement get a‘s address that is assigned to a pointer  pointing to character. The last statement use printf function print out value of variable i and *b according a particular pattern.

When i use vs2012 ?compile program , the value of i is 0x000000f7 and the *b is 0xfffffff7.

输出的i为0x000000f7并不奇怪,因为a是个无符号的整形数被赋值给无符号的字符数时发生了字节截断,故第二条语句执行完后i的值为0xf7,再 根据printf指定的输出格式即按十六进制输出,位数为8位。但是*b的值估计也“不难”理解:这里做了指针转换即把unsigned int a的地址转换为char类型的指针,影响了指针的寻址。故b所在的内存里存的值便为0xfffffff7。这种解释正是XX宝典中的解释,很明显这种解释 太过牵强,甚至可以说的错误的,试想一个字符型的指针指向的值怎么会是0xfffffff7。如果非要说这样是对的,我可以继续做下面这个测试。

技术分享

这是比较讽刺的。a被赋值为0x123456f7后*b竟然依然为0xfffffff7。这到底发生了什么,正确的解释可是是这样的。:)

第三条语句其实同样发生了字节截断,&a的数据类型被强制转换为?char *后,此时b只能指向0xfffffff7或是0x123456f7最低的一个字节所在的地址,原因是我们用的一般都是X86 PC机,它是以little-endian方式存储。(So ,what is little-endian ? you can search it with internet.) 故*b的值为0xf7。当使用printf函数输出结果时,在参数发生了default argument promotions . C语言规定了:不足int的整形提升为整形,float 提升为 double。对于char *类型的b所取得值0xf7, 这是二进制补码表示形式转换为十进制整数为-9,而-9按int型入栈时为0xfffffff7,其实面试题上输出时还给定了格式x,其实这样分析完根本就不需要按八位输出,因为肯定是输出八位的 :)正如上图我略去08后依然输出fffffff7。

?是不是结束了?我觉得还没,如果我把代码改成这样,结果又会是什么呢?: )

技术分享

好了。结果貌似不是期望的ffffff78,哈哈,其实也没什么奇怪的。0x78转换为二进制最高位0,也就是正数,而正数的补码跟原码一样故输出为0x78,如果这时给出格式符x,输出就是00000078(很明显高位根据格式补零了)。

关于printf输出问题还有其他类似的情况,所以遇到实参和形参的类型不一样时务必要警惕。

到此,这个问题先告一段落了。 :)?

 

a interview question(1)

原文:http://www.cnblogs.com/Koestler/p/5141496.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!