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

Lecture 02 Bits, Bytes, and Integer_哔哩哔哩_bilibili

不是课程知识点罗列总结,只是根据个人的理解将部分知识点进行做笔记,仅仅根据个人理解不完全正确。

一、有符号数和无符号数的区别

首先是在表示范围上,这里就不再赘述。其次是运算上,有符号数和无符号数进行运算时都会化为无符号数,这里会导致一些程序错误。

int a=10;
for (int i=a-1;i-sizeof(char)>=0;i--){
    cout<<i<<endl;
}

这里就会不能得到理想中的结果,由于sizeof函数返回的是unsigned类型,所以判断条件中结果为unsigned类型,因此始终大于等于0

二、有符号数的表示

补码产生的原因在于方便运算,将减法变为加法运算(对于负数的补码表示是重点),

对于一个数x,那么他的补码的产生就是源于表达式Y-X,这里转化为Y+(-X)那么重点就是表示(-X)这个数。因为计算机是有限数位,因此对于用n位二进制表示数时表达式可化为Y-X+2^{^{n}},即Y+\left ( 2^{n}-X \right ),因此-X的二进制表示为2^{n}-X。根据无符号数X(正数)的表示自然容易得到-X(负数)的二进制表示。因此将有符号数的标识完全定义。

根据推导过程可以理解到,对于一个数转换为相反数只要进行求补运算即可,即2^{n}-X(X是补码表示)。

单纯利用该方法得到的有符号数的范围不够,会导致正数和负数采用同一编码,如5位数11000表示无符号数为24,按照上述说法进行求补运算之后为01000可表示无符号数为8,有符号数为-24。根据求补运算可以得到有符号数的正数可以和负数一一对应的,两者二进制关于2^{n}互补。所以将5位二进制数的表示范围进行划分,容易理解的形式就是最高位为符号位,0表示非负数,1表示负数。对于非负数数的表示和无符号数一致,负数根据转换得到。特殊情况就是+0和-0是同一个,采用+0的表示方法00000,对于-0对应的补码10000表示为负数对应-32.

三、负数的补码表示的特殊

对于一个负数的补码,将其转换为十进制有两种方式:
1.运用求补运算得到相反数

2.采用权值进行计算。(理解:最高位是符号位1,“有效数位”是后面的位,进行求补运算用2^{n-1}也行)

对于负数-X的补码表示其对应的无符号数的运算技巧是:2^{n}-X 例如-3的补码是11101,32-3=29,而11101就等于29(因为3和29在5位二进制表示中互补,负数补码的产生原理)

二进制求补运算的两个数,用有符号数理解为相反数,对于无符号数的理解为补数。

四、对于有符号数的扩展和缩减

扩展:正数补零,负数补1

缩减:缩减1位(符号位)

对于缩减之后看作无符号数:相当于符号位变为0。对于正数无影响,负数就是相当于加上2^{n-1}.

例如10011(-13)变为0011(3)(关于2^{n-1}互补)

对于缩减之后看作有符号数:和缩减之后的最高位有关。以负数为例

首位为0:相当于结果为正,那么结果等于无符号数的情况(由负到正)

首位为1:相当于结果为负,那么结果等于符号扩展的逆向,结果不变(由负到负)

同理对于正数:由正到正不变,由正到负相当于减2^{n-1}。例如:01011(11) 1011(-5)过程是右侧等于11011(-5),等于01011-10000.

总结:符号不变,结果不变,符号改变,变为“补数”。

五、二进制求模运算技巧

例如11011(27)对于8求模,就是011(3)即后三位。对于2^{n}进行求模就是保留余下n位。

解释:将二进制进行按照权值展开,求模运算就是取余数。对于权值表达式进行除法且被除数为2^{n},那么权值高于2^{n}的位的值作商,余下位为余数。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值