《深入了解计算机系统》(CSAPP)学习记录--Lecture03

Lecture 03 Bits, Bytes, and Integers cont_哔哩哔哩_bilibili

对于补码计算进行一些思考。例如思考负数之间采用补码(n位)进行加法运算结果的正确性。思考过程如下:

一、负数加负数过程:

对于补码运算的过程就是二进制码的相加,无论看成是无符号数和有符号数的运算其最终的结果都是相同的n位二进制码,但运算过程看作正数容易理解。因此为了验证负数加法运算的结果,将运算的操作数都看作是无符号数进行加法运算(对于正数的运算过程是否正确还是一眼就能看出来的。)

\left ( -X1 \right )+\left ( -X2 \right )=2 ^{n}-X1+2^{n}-X2= 2^{n+1}-(X1+X2)

根据上述推导可以知道(-X1)+(-X2)结果对应的二进制码表示无符号数2^{n+1}-(X1+X2)。如果结果用n+1位表示,那么2^{n+1}-(X1+X2)对应的有符号数就是-(X1+X2),此时运算结果是正确的,但是现在是n位二进制表示。这不能说明运算结果一定正确也不能说明一定错误。

二、取结果后n位:

n位计算结果和n+1位运算结果的联系:很容易看出来,n位运算结果是n+1位运算结果的后n位。那么就是要讨论取后n位结果是否表示同一个数,如果是同一个数就是正确的,反之不然。

这就是符号扩展的逆过程,对于负数的符号扩展就是前面补1,对应的数不变。因此相反过程就是符号前两位均为1,去1数不变。如11011(-5)和1011(-5),以及10100(-12)和0100(4).

因此对于n+1位结果为11xxx表示正确答案,如果为10xxx则是错误答案。

对于负数(1xxx)的加法运算结果一定是(1xxxx

同时对于n位二进制表示的有符号数是1xxx,所以证明当结果能被n位表示时,负数采用补码进行加法运算可以被正确表示。

对于超出范围的值采用n位二进制数表示则一定是正数(0xxx)。因此对于两个负数对应的二进制码进行运算,只要看最后结果的最高位就能知道是否溢出。(1101+1000的最高位是0一定溢出)

三、有符号数溢出的判断:

对于正数加正数的结果也会溢出,这又有什么规律呢?正数和正数之间的溢出很好判断。对于正数溢出就是最高位由0变为1。也是同理看作无符号数(当然就是本身),对于可表示范围内的值自然是正确的(0xxx),对于溢出的情况结果一定是负值(1xxx)。

注意到:如果用n+1位数表示结果最高位就是0(0xxxx),01xxx为错误,00xxx为正确答案

因此对于有符号数的运算结果可以从进位和符号位之间判断结果是否溢出:11和00为正确答案,10和01为溢出。但是这是只是适用于同符号的操作数相加。

对于正数+负数的情况可以从负数采用补码表示的原因说明,而且没有溢出。但是发现正数+负数会有进位,0+1=x的情况,因此对于上述的结论有一定的限制。

进行修正:如果符号位和最高的数值位不同时进位,则溢出。

或溢出的情况只有0xxx+0xxx=1xxx和1xxx+1xxx=0xxx时

四、对于溢出之后的结果分析:

对于溢出之后的结果只是缺少符号位,而且符号位的值和最高位的值相反。

符号扩展(变号版):对于n位二进制数进行符号扩展,并且是和符号位的数不同时

通过关于2^{n}进行“互补”得到结果:2^{n}-xx-2^{n}得到正确结果(记忆方式:先得到互补值,再符号改变)例如如下:

0100(4)  10100(4-16=-12)

1100(-4)01100(-4+16=12)

由正到负:能印证上节课的关于补码的带权展开式,例如1010=1*2^{-3}+2(010)=-6

(看作是1+010)。1xx...x=1*2^{n-1}+xx...x(n-1bit)= 1*2^{n}+xx...x(n-1bit)-2^{n}=-1*2^{n}+xx...x(n-1bit)

由负到正:就是将有符号数化为无符号数。

对于二进制的理解重点是关于补码的理解,尤其是补码表示的有符号数和对应的无符号数之间变化。以及对于“符号扩展”和“符号缩减”的理解,溢出结果的判断。(后续学习得到溢出不仅仅可以通过单符号位判断还可以双符号位:仍是符号扩展,但是看作是更多位的有符号数运算,此时原来溢出的结果可以被表示,通过和正确结果进行比对得到关系。这里对于有符号运算进行扩展的前提是负数加法运算是正确的,似乎需要分开来证明)


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值