课后习题2.31—2.32

关于溢出
——课后习题2.31、2.32;
c语言中分无符号数,有符号数;两者都存在溢出。这里结合模的概念图解溢出,见下图:
图1
上图以有符号八位数为例,简单的理解了这一思想。这样一个环上共有两个 ”128“(即2^8),0—128:-128— -0。为了使这样一个环均分,将0分给正数,128分给负数。于是乎,就有了0——127 :-128—— -1。这样正好对应了一个字节大小有符号整数的取值范围:-128—127。
溢出怎么说?就是从计算机的角度而言:127+1= -128。(为什么?请自己画一个圆,按上述的方法分,即可得出。)这样,就算是溢出了。
回到第31题,设x=2,y=127.这样一来,从计算机的角度:sum= -127,溢出;再用sum-x,答案是y。
为何要强调 “从计算机的角度” ?,这一必须明白:我们用二进制,用符号位区表示有符号的负数,这算作原码,而计算机在做有符号数的加减时用的是补码:原码——>取反——>加1;
从计算机的角度算上述:
x+y=127+2=
0000 0010(正数的补码是它自己)+ 01111 1111(正数的补码是它自己) = 10000 0001(补码)
补码——减一——取反(最高的符号位不变)——原码(11111 1111)。于是,从人类的角度来看,上述结果为:-127。
继续,从计算机的角度:sum-x= -127 - 2 = -127 + (-2) = 1000 0001 + 1111 1110(补码) = 1 01111 1111;请注意,这里只有八位,多出的需要截断,因此计算机中正真的补码是:01111 1111 即127;
对于题32。看着上图,加上正数,顺时针转动;加上负数,逆时针转动。Tmin = -128;当x=2,y=Tmin时,看似:2 + 128 ,实际上,计算机仍以1000 0000存储这一个数。亦即,还是:2 + (-128),并无溢出;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值