补码与有符号数范围判断

一、补码

先说概念,

机器数:一个数在计算机中的二进制表示形式,带符号,最高位是符号位,正数为0,负数为1

真值:因为机器数带符号,直接按照二进制转换的话,得到的数值不一定是存储的真正的数值,所以机器数表示的实际的那个值,叫真值,例如1000 0001的真值 = –000 0001 = –1。

原码:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。对于8bit数,其取值范围是:[1111 1111 , 0111 1111],也就是[-127 , 127],这个被叫做人脑最容易理解和计算的表示法。

反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

补码:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后 +1。(即在反码的基础上 +1)。

补码的出现是为了让符号位参与到运算中。

如果直接是原码来参与,会出现如下结果:

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

这结果显然是不对的,所以出现了反码,使用反码参与计算时:

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

计算结果的真值是没问题的,但是对于结果0,对于实际的运算,+0和-0是一样的东西(数学中,对于极限等证明时,会区分+/-0),0带符号没啥意义,而且这样会出现[0000 0000]原 和 [1000 0000]原 两个编码分别表示了+0和-0,用2个编码保存一样的数非常浪费。

所以使用补码:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

这个时候,0可以用[0000 0000]表示,-0就没了。

然后这个[1000 0000]这个数呢,就表示-128了,为什么,因为

  • 128 = -127-1 = [1000 0001]补 - [0000 0001]补 = 1000 0000

所以,使用补码表示时,解决了有符号数中+0和-0的问题,并且还可以多保存一个最小值。

因此,使用原码和反码表示时,是无法出来-128的,现代计算机对于有符号数,都是采用补码表示,所以**8bit范围是-128~127,**其他有符号的数也同理。

二、有符号数范围判断

依旧以8bit有符号数为例,记为a,判断该有符号数属于[-16~15]。

真值-1615
原码1001 00000000 1111
补码1111 00000000 1111

有符号数属于【-16~15】范围内,则有高四位为全1或全0.

因此可以得到逻辑表达式:

&a[7:4] | &~a[7:4]
展开为
a[7] & a[6] & a[5] & a[4] | ~a[7] & ~a[6] & ~a[5] & ~a[4] 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值