700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 在C语言程序中 将变量赋值为-1 再用printf打印 为什么输出一个很大的数? – 网络

在C语言程序中 将变量赋值为-1 再用printf打印 为什么输出一个很大的数? – 网络

时间:2021-12-19 17:47:55

相关推荐

在C语言程序中 将变量赋值为-1 再用printf打印 为什么输出一个很大的数? – 网络

题外话

在分析这个问题之前,先说些题外话。有程序员认为研究这样的代码没有意义,无异于孔乙己的“茴”字有几种写法。

这个问题其实并不是偶空想出来的。

最近,偶的一个同事被他的C语言程序bug困扰了好几天,始终无法找到问题究竟出在哪里,于是找偶,偶看到他的代码居然混用无符号变量和有符号变量,于是就提醒他注意这个方面,后来发现果然是这个原因。他的问题涉及到比较复杂的项目,完整的复述一遍不太现实,于是偶把他的问题精简一下,就构成了上述C语言代码段。

事实上,很多公司招聘时,都有一些面试题或者笔试题看起来很怪异,很不符合标准的开发规范,于是有些程序员就认为做这样的面试题是完全没有意义的,甚至觉得做这些题目是一种侮辱。

其实换个角度想想,这些题目很能考察一个人的基本功,它们很可能来自公司内部的某个项目的某次重大bug。C语言是一门极其重视基本功的编程语言,这些题目很能查漏补缺。

分析

现在来考虑上面这段C语言代码,大家编译并执行它,得到了下面的输出:

C语言程序的输出出乎了一些朋友的预料,-1容易理解,255是怎么回事呢?

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

所以对于-1,其原码原本是0b10000001,但是计算机内部存储该数值时,是以补码形式存储的。-1的补码等于反码+1,也即0b11111110+1=0b11111111=0xff。

到这里就清楚了,变量b在内存里的8个bit都是1,它是一个unsignedchar型的变量,最高bit也表示数值,也即b等于255。

现在再来分析变量c和变量d的值,它俩都是有符号型的int型。按理说,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语言是一门极其重视基本功的编程语言,事实上,本节涉及的知识点非常基础,无非就是原码补码,以及整型提升的相关知识。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。