CS学习(四)——整数的编码

本文详细解释了二进制与十进制的转换,涉及无符号数和有符号数的补码表示法,包括负数补码计算、符号位扩展策略以及无符号/有符号数加法、乘法的规则,还讨论了溢出和除法中的取整问题。
摘要由CSDN通过智能技术生成

二进制转十进制

无符号数:

6d50bf5868364ddd9fca44b242c88e63.png

有符号数:

8da8bb4223a949309881913877394c0b.png

来源:湖大CS课题组(侵删)

对字长为w的负数x求补码:

法一:写出原码,除符号位外均变反,再+1。

法二:

02064909cd794a3a97631942d74e7f92.png

法三:

52f1bb49bd4949628cc48d724b88dfff.png

来源:湖大CS课题组(侵删)

二者之间的转换:

有符号数 --> 无符号数:

94dd96dcf2324e4b8964cbc4cfa11c1c.png

反之:

432d947a6bea40e5ac57089a265db8ca.png

举个例子就很好理解了:

1001:U=9,T=-7。

思考:若有一个w位的有符号数补码,想扩展k位,该怎么办(保证值不变)

正数自不必说,原先的w位不变,w+1~w+k位为0即可。

负数:

扩展k位之后的补码:2^(w+k)-|x|

原先的补码:2^w-|x|

相差:2^(w+k)-|x|-(2^w-|x|)=2^w(2^k-1)

要使扩展后的值不变,|x|要加上上述相差的值

2^w(2^k-1):2^k-1就是111111(k个1),乘以2^w就是左移w位,右边以0补齐w位。

加上原来的补码值刚好将w个0补齐。

总结:扩展k个符号位。

eg.

-6:

4位补码:1110

扩展至8位:1111 1110   

截断

一言以蔽之:高位被丢弃,只保留低位。

对于无符号数来说就是取模运算mod。

对于有符号数类似取模(可能要进行类型转换)。

无符号数加法UAdd

cdd0debbbe9e4823a710742fa87ac7d2.png

(忽略最高进位)

补码加法TAdd

“位”上的操作跟UAdd一样。

溢出情况处理:

cf456e539fb44caaae91bb57c7f08968.png

0af5d6f456664642babbc29d6f69cfb3.png

来源:湖大CS课题组(侵删)

对于和>=2^(w-1)的称为正溢出,这时由于符号位因为进位的原因变为1所以结果为负数。

对于和<=-2^(w-1)-1的称为负溢出,这时由于符号位相加导致进位,并且最高位被舍弃成为正数。

无符号数乘法UMulti

两个w位的无符号数u,v相乘,得到2w位的结果,舍弃前w位。

UMulti(u,v)=u*v mod 2^w

有符号数乘法TMulti

与UMulti有相同的位级行为,只是需要修正。

TMulti(u,v)=U2T(u*v mod 2^w)

乘以常数

用移位(移一位就是乘二或除二)代替乘法:

eg.u*8 == u<<3

u<<5 - u<<3 == u*24

大部分的机器中移位和加法比乘法快很多。

除以常数

类似乘法

右移:

x>>k 等价于 x/2^k(注:向下取整)

想向上(向0)取整咋办?

1.真实结果不是小数的情况

不用取整

2.是小数

(x+(1<<k)-1)>>k修正,即((x+2^k-1)/2^k)向下取整(仅被除数为负数适用)

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值