an interview question(1)
声明:本文为博主原创文章,未经博主允许不得转载。
以下是英文翻译:
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.
#include <stdio.h>
int main ( )
{ unsigned int a=0xfffffff7;
unsigned char i=(unsigned char)a;
char *b=(char*)&a;
printf("x,%x\n",i,*b);
}
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输出问题还有其他类似的情况,所以遇到实参和形参的类型不一样时务必要警惕。
到此,这个问题先告一段落了。 :)
an interview question(1)的更多相关文章
- Core Java Interview Question Answer
This is a new series of sharing core Java interview question and answer on Finance domain and mostly ...
- shit LeetCode interview Question
shit LeetCode interview Question https://leetcode.com/interview/1/ 有点晕,啥意思,没太明白,到底是要按什么排序呀? 去掉 标识符 不 ...
- JavaScript interview Question - Create a Array with two papameters without using loop!
JavaScript interview Question - Create a Array with two papameters without using loop! JavaScript - ...
- An interview question from MicroStrategy
去年校招时的一道面试题,觉得蛮有意思,贴出来. Question: Spy start at a, during an interval he moves |b| to right when b &g ...
- an interview question(4)
版权声明:本文为博主原创文章,未经博主允许不得转载. 写这篇博客前请让博主先吐糟下自己的PC. i3+2G内存+开了一上午=C盘剩下0字节+打开VS2012花了半个小时+一晚上的心情不好 吐槽完PC, ...
- an interview question(3)
最近看了些C面试题顺便复习一下C语言,现贴一些出来和大家分享. #include <stdio.h> void main () { ,,,,};--------- *(ptr++)+=; ...
- an interview question(2)
感觉现在好多面试题还是很注重基础的,今天面试时就遇到这题,回来一查后才知道此题是国内某著名通信公司的一道机试题:) 给定一个数组input[ ],如果数组长度n为奇数,则将数组中最大的元素放到 out ...
- Interview Question
HDS(11.16.2015): How to design an non-stop website like Google or Amazon? What design patterns are y ...
- Amazon Interview Question: Design an OO parking lot
Design an OO parking lot. What classes and functions will it have. It should say, full, empty and al ...
随机推荐
- UEFI引导在GPT分区下安装win2008——抓住那只傲娇的win2008
上周遇到个客户DELL R520的服务器新采购了8块3T硬盘做备份服务器,raid配置5+1,一个磁21.8T.先用普通的装desktop OS的方法发现进去没raid盘,然后就按照官方的文档进入Li ...
- JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz
iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码) 最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...
- Windows Phone 七、XML序列化
DataContractSerializer对象 public class Person { public int Id { get; set; } public string Name { get; ...
- 关于在linux中使用图形界面的网络管理工具
有好几种自动设置的工具可以选择(既然说是自动设置的工具,那就说明有手动设置的工具,例如 使用 ip, iw, iwconfig 这些命令设置网络),例如:Connman, netctl, Networ ...
- oracle的IMU和ora-01555
IMU: 01555: 按照上图找啊找,已经提交事物的undo块找不到了,就产生01555错误,解决这样问题:1. 确保undo表空间数据的保留时间至少大于最长sql语句的时间 2. 增大undo表空 ...
- IDEA 将已有项目添加到git
首先,我们解决的情况是,已经有了一个正在开发的项目,现在我们要把他分享到git@osc上面去. 1.第一步,当然是先在Git@OSC上创建仓库,拿到Git@OSC仓库的HTTP连接http://git ...
- [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'
这个系列的博文知识回顾sql知识作的记录,温故而知新.上一篇内容达不到知识分享的层级被移出园子首页,对不住各位看官,内容简单了些.下面咱就记录多一些的基础知识,薄利多销: 控制用户权限 • 创建用户 ...
- Android学习计划
书目 疯狂Android讲义 Android开发艺术探索 Android群英传 Android 源码设计模式解析与实战 Android内核剖析 深入理解 Android自动化测试 代码 信念 坚持.坚 ...
- 通过servlet实现几个网站常用的功能
帮朋友写的小程序,由于功能比较简单所以就偷懒只使用了Servlet 一.JSP页面部分(这个部分的设置比较粗糙,主要是为了查看功能能否实现,如果需要向用户展示还得修饰一下) 1)功能页(所有需要后台实 ...
- centos7配置静态ip后仍然显示动态ip
我在虚拟机上安装了CentOS7操作系统,将 /etc/sysconfig/network-scripts/ifcfg-eth0 文件配置静态 IP 为192.168.1.210,如图1: 然后我用 ...