8位有符号类型的数最小值为什么是-128

8bit无符号数范围为:0 ~ 255,这是没有什么疑问的。
8bit有符号数范围为:-128 ~ 127 ,然而直观来看,0000 0001即为1,1000 0001即为-1,那么很容易得到8位有符号数值的表示范围应该是1111 1111 ~ 0111 1111,也就是-127~127,那么-128怎么来的呢?(这其实是从原码的角度看的)

原码:是一种计算机中对数字的二进制定点表示方法,平时正常用的二进制表示法。

反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同;负数的补码等于其反码+1。

如果直接进行原码运算,例如1+(-1)=0,运算的时候0000 0001 + 1000 0001 = 1000 0010(-2),很显然是错误的,因此符号位和数值位必须分开处理!这会增加计算机的硬件开销。那如果换成补码,1的原码,反码,补码均为0000 0001(正数三者一致);-1的原码1000 0001,反码1111 1110,补码1111 1111(1111 1110 + 0000 0001);因此1+(-1)用补码来运算就是0000 0001 + 1111 11111 = 0000 0000(最高位溢出舍弃),结果是正确的。

由此可见,可以将减法运算转化成加法运算,计算机只需要实现加法电路即可,并且原码到补码的转换和补码到原码的转换过程是完全一致的,为什么?可以简单证明如下:

假设32位机器,X为负数(最高位是符号位,对于负数,即为1),则有X(绝对值)+X(反)=0xFFFFFFFFF,因此X(绝对值)+X(反)+1=0xFFFFFFFFF+1=0;所以得到0-X(绝对值)=X(反)+1,根据之前的定义X(反)+1即为X的补码,于是有X(补)=X(反)+1=0-X(绝对值);

1)那么对于A、B>0,令K=-B,显然K是负数,那么有A-B=A+(0-K(绝对值))=A+K(补),减法运算就转化成了加法运算。

2)X(绝对值)=0-X(补);两边同时乘以-1
得到-X(绝对值)=-0-(-X(补))=0-(X(补(绝对值)))=X(补)(反)+1;-X(绝对值)即为原码X;因此上式说明了原码X等于X的补码取反后加一,也就是说X补码的补码就是原码。不论是原码求补码还是补码求原码方式完全一致。

  1. 减法运算可以视为加一个负数,二进制运算变为加这个负数的补码。(减一实际为加负一的补码)
  2. 一个负数补码的补码是源码。

回到最开始的问题,8位有符号数值的最小值为什么是-128而不是-127呢,我们列出来部分原码、反码和补码的对照表看看:

从上表中我们可以看出,0在原码和反码中有两种表示方式,而对应的补码只有一种表示方式,-128在原码和反码中无法表示,在补码中却可以表示(用-127的补码1000 0001减1得到1000 0000)。而计算机中数值以补码形式存储和运算,当然-128可以表示出来,因此8位有符号数值的范围是-128~127,同理其他位数(16、32、64)也可以以此类推。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值