本文作者:凯少技术网

一个看似简单却很容易犯错的C语言试题,来试一下?

凯少技术网 1个月前 ( 08-16 ) 68 抢沙发
摘要: 无意间看到了一个比较有意思的C语言题目,看似简单,但问了我一同事他却答错了,里面的几个陷阱和考察的知识点比较有代表性,拿出来与大家分享一下:问题很简单,以上指令会输出什么结果?大家...

无意间看到了一个比较有意思的C语言题目,看似简单,但问了我一同事他却答错了,里面的几个陷阱和考察的知识点比较有代表性,拿出来与大家分享一下:

问题很简单,以上指令会输出什么结果?


大家可以先自己思考一下,我们就直接给出运行结果了:

是不是很奇怪,怎么会出现了255,-1是没问题的。别急,下面我们一步一步分析:


先来分析a和b的值:

我们首先要明白的是,在计算机中整数通常采取补码的形式存储。负数的补码等于其反码+1,负数的反码符号位不变,数值为按位取反。对于 signed char 型变量,大部分C语言编译器都是由 8 个 bit 组成的,最高一个 bit 通常表示符号位。


所以对于 -1,其原码原本是 0b10000001,但是计算机内部存储该数值时,是以补码形式存储的。-1 的补码等于反码+1,也即 0b11111110 +1 = 0b11111111 = 0xff。到这里就清楚了,变量 b 在内存里的 8 个 bit 都是 1,它是一个 unsigned char 型的变量,最高 bit 也表示数值,也即 b 等于 255。


再来分析 c 和 d 的值:

按理说,a 和 b 在内存中的布局是一样的,都是 8 个 bit 的 1,为什么传递给 c 和 d 就不一样了呢?其实C语言在处理 c = a; 和 d = b; 这两句赋值语句时,有一个过程没有显式的表现出来,即“整形提升”。以 c=a; 为例,因为 c 和 a 的数据类型不同,所以C语言在处理赋值时,为了不丢失精度,会将 a 中的数值也强制转换为 int 型。


a 中的数值是 -1,提升为 int 型后依然是 -1,而不是 0x000000ff(255,这里假设 int 类型占用 4 字节内存空间)。至于变量 d 的值,就更简单了,就是简单的赋值而已。


怎么样,到这里大家应该都清楚了,其实这道题目主要涉及了整数存储方式(补码反码)和整形提升(无符号数和有符号数)两个知识点,都属于C编程中的基本功,希望此题对大家有帮助,感谢耐心阅读!


凯少技术网官方公众号

文章版权及转载声明:

作者:凯少技术网本文地址:https://www.skyko.cn/?id=499发布于 1个月前 ( 08-16 )
文章转载或复制请以超链接形式并注明出处凯少技术网

赞(0

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

评论列表 (暂无评论,68人围观)参与讨论

还没有评论,来说两句吧...