首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请进,关于C语言,一路经典面试题目

2013-04-09 
请进,关于C语言,一道经典面试题目题目如下:引用13. 评价下面的代码片断:unsigned int zero 0 unsigned

请进,关于C语言,一道经典面试题目
题目如下:

引用
13. 评价下面的代码片断:

unsigned int zero = 0; 
unsigned int compzero = 0xFFFF; 
/*1's complement of zero */

对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:

unsigned int compzero = ~0;

这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。 
到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧…


字长的事情我清楚,不清楚地是,这里的 “~0” 代表什么?求指教!

再有,第一行语句:
unsigned int zero = 0;
应该没有问题吧,谢谢!


[解决办法]
您还是没太体会字长的重要

unsigned int compzero = 0xFFFF;
意图是想让compzero 全是二进制1,但是 0xFFFF是代表程序员认为int 是2个字节的,在两个字节的机器上这样可以要是4字节呢?系统就自动变成相当于unsigned int compzero = 0x0000FFFF;的形式这下和你的意图不一样了吧?

那我想在2或4字节都全1怎么办

unsigned int compzero = ~0;
~0是在说我不管你是两字节还是四字节我只要全1,系统你自己去自适应去,所以写成~0,这样在两字节机器上系统会自动变成0xFFFF,四字节机器上变成0xFFFFFFFF保证了你的意图
[解决办法]
无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据。

比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。

由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。同时在相同位数的情况下,所能表达的整数范围变大。

如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。

这就是16位-1为什么要强制转换为(unsigned int).......
 
经过这番总结,前面提出的问题的答案应该就很明显了吧。-1必须转换为unsigned int型,32位即0xffffffff,很显然溢出了。

热点排行
Bad Request.