深入理解计算机操作系统
关于溢出
——课后习题2.31、2.32;
c语言中分无符号数,有符号数;两者都存在溢出。这里结合模的概念图解溢出,见下图:
上图以有符号八位数为例,简单的理解了这一思想。这样一个环上共有两个 ”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),并无溢出;