为什么8位有符号类型的数值范围是-128~127

如题所述

我们知道,对于有符号类型,计算机在处理的时候会把最高位当做符号位,0表示正数,1表示负数。举例来说(以下举例均针对8位有符号数):

0000 0001 即为 1 , 1000 0001 即为 -1 ,那么很容易得到8位有符号数值的表示范围应该是 1111 1111 ~ 0111 1111 ,也就是 -127 ~ 127 ,问题来了, -128 是怎么来的呢?

在说明这个问题之前,先来补充点额外的知识:

在计算机的存储和计算中,统一的是采用补码进行处理和运算的,在弄清楚采用补码的好处之前,我们需要明确如下三个概念:

很明显,文章开头的举例即是原码,它很符合我们的直观感觉,但是在计算的时候麻烦就来了,如果直接运算,例如 1+(-1)=0 ,运算的时候 0000 0001 + 1000 0001 = 1000 0010(-2) ,很显然是错误的,因此符号位和数值位必须分开处理!这会增加计算机的硬件开销。我们换成补码试试,1的原码 0000 0001 ,反码 0000 0001 ,补码 0000 0001 (正数三者一致);-1的原码1000 0001,反码1111 1110,补码1111 1111(1111 1110 + 0000 0001);因此1+(-1)用补码来运算就是0000 0001 + 1111 11111 = 0000 0000(最高位溢出舍弃),结果是正确的。

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

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