今天看到了一个比较有意思的C语言题目,看似简单,但里面的几个陷阱和考察的知识点比较有代表性,拿出来与大家分享一下:
问题很简单,就问会输出什么?大家可以先自己思考一下,我们就直接给出运行结果了:
是不是很奇怪,怎么会出现了255,-1是没问题的。别急,下面我们一步一步分析:
先来分析a和b的值:
我们首先要明白的是,在计算机中整数通常采取补码的形式存储。负数的补码等于其反码+1,负数的反码符号位不变,数值为按位取反。对于 signed char 型变量,大部分C语言编译器都是由 8 个 bit 组成的,最高一个 bit 通常表示符号位。
再来分析 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编程中的基本功,希望此题对大家有帮助,感谢耐心阅读!
领取专属 10元无门槛券
私享最新 技术干货