[技术手册] C语言经典问题及解析

[复制链接]
630|10
 楼主| 星辰大海不退缩 发表于 2023-12-16 14:17 | 显示全部楼层 |阅读模式
①下面的代码输出是什么,为什么?

  1. void foo(void)
  2. {
  3.     unsigned int a = 6;
  4.     int b = -20;
  5.     (a+b > 6) ? puts("> 6") : puts("<= 6");
  6. }

考察点:

这 个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。

不管如何,这无符号整型问题的答案是输出是 ">6"。原因 是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。

因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。

如果你答错了这个问题,你也就到了得不到这份工作的边缘。


②评价下面的代码片断:

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

考察点:

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

  1. unsigned int compzero = ~0;


这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件

作为一个无法避免的烦恼。

到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。

但如果显然应试者做得不错,那么我就 扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如 何,你就当是这个娱乐吧...

AdaMaYun 发表于 2023-12-16 14:25 | 显示全部楼层
楼主这个问题确实是很容易犯错,讲解的很详细
jf101 发表于 2023-12-19 09:52 | 显示全部楼层
int型应该是16位的
LOVEEVER 发表于 2023-12-19 10:06 | 显示全部楼层
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
OKAKAKO 发表于 2023-12-19 10:10 | 显示全部楼层
C语言中的整数自动转换原则基本都是向下转换
小小蚂蚁举千斤 发表于 2023-12-19 10:44 | 显示全部楼层
数据类型自动转换时确实需要注意
forgot 发表于 2023-12-21 08:56 | 显示全部楼层
考察C语言中的整数自动转换原则
中国龙芯CDX 发表于 2023-12-21 09:02 | 显示全部楼层
0xFFFF这个是32位的确实对应16位是不正确的
 楼主| 星辰大海不退缩 发表于 2023-12-21 12:37 | 显示全部楼层
jf101 发表于 2023-12-19 09:52
int型应该是16位的

其实数据类型是基本知识但很多人不注意
 楼主| 星辰大海不退缩 发表于 2023-12-21 12:37 | 显示全部楼层
中国龙芯CDX 发表于 2023-12-21 09:02
0xFFFF这个是32位的确实对应16位是不正确的

确实问题在这里
szt1993 发表于 2023-12-22 08:21 | 显示全部楼层
中国龙芯CDX 发表于 2023-12-21 09:02
0xFFFF这个是32位的确实对应16位是不正确的

看了评论确实感觉细节很重要
您需要登录后才可以回帖 登录 | 注册

本版积分规则

309

主题

2870

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部