打印
[技术手册]

C语言经典问题及解析

[复制链接]
273|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
①下面的代码输出是什么,为什么?

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}

考察点:

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

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

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

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


②评价下面的代码片断:

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

考察点:

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

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 | 只看该作者
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。

使用特权

评论回复
5
OKAKAKO| | 2023-12-19 10:10 | 只看该作者
C语言中的整数自动转换原则基本都是向下转换

使用特权

评论回复
6
小小蚂蚁举千斤| | 2023-12-19 10:44 | 只看该作者
数据类型自动转换时确实需要注意

使用特权

评论回复
7
forgot| | 2023-12-21 08:56 | 只看该作者
考察C语言中的整数自动转换原则

使用特权

评论回复
8
中国龙芯CDX| | 2023-12-21 09:02 | 只看该作者
0xFFFF这个是32位的确实对应16位是不正确的

使用特权

评论回复
9
星辰大海不退缩|  楼主 | 2023-12-21 12:37 | 只看该作者
jf101 发表于 2023-12-19 09:52
int型应该是16位的

其实数据类型是基本知识但很多人不注意

使用特权

评论回复
10
星辰大海不退缩|  楼主 | 2023-12-21 12:37 | 只看该作者
中国龙芯CDX 发表于 2023-12-21 09:02
0xFFFF这个是32位的确实对应16位是不正确的

确实问题在这里

使用特权

评论回复
11
szt1993| | 2023-12-22 08:21 | 只看该作者
中国龙芯CDX 发表于 2023-12-21 09:02
0xFFFF这个是32位的确实对应16位是不正确的

看了评论确实感觉细节很重要

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

243

主题

1882

帖子

5

粉丝