从一段小小的C语言程序说起(1)

 

 

既然是从一个C语言程序,那么就先把这程序贴出来,确实是一个很简单一眼就能看出肯定有问题的程序。

 

 

第一个问题: 在运行中,如果输入300和200后,结果为什么会输出-12?

这个问题不难回答,其实在编译的时候gcc编译器就给出了两句警告也说明了这个问题。

 

也就是在输入的时候发生了截取,以下程序可以很好的说明情况。

 

 

输入:300 200  //12c c8
截取为:2c c8   //44 -56
结果为:-12


注:这里用截取只是好理解,实际上是污染了后面的内存空间


可能有人看不懂,那以-56为例说明如下:

10111000  //-56的原码
11000111  //反码
11001000  //补码,即c8

 

--------------------------------------------------------------------------------------------------------

 

第二个问题:

 

这里还有一个问题,只是因为数值输入的比较小,一个300,一个200,这个问题没有体现出来,就是这样输入对后面内存空间的“污染”问题(请允许我这里使用污染这个词,没想到更合适的)。

 

会发现输入第一个300时,这时的数组i的内存空间是这样的i[0]:44 i[1]:1 i[2]:0 i[3]:0

解释起来很简单,300的二进制0000 0001 0010 1100(按4字节),依次对号入座就可以了

那么输入200时从i[1]开始,200的二进制0000 0000 1100 1000,再次对号入座

现在的数组i的内存空间就成了我们看到的 i[0]:44 i[1]:-56 i[2]:0 i[3]:0

 

所以当输入的数值过大时,问题就来了,i[2]和i[3],最可怕的是可能不存在的所谓i[4]也被无奈赋值了

 

:如有差错,欢迎拍砖

 

------------------------------------------------------------------------------------------------------

 

转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——

pang123hui的博客:


CSDN http://blog.csdn.net/pang123hui/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值