计算机眼中的负数

246 阅读2分钟

引言

正负数在计算机中是靠二进制首位的符号位来区分的,首位为0则是正数,为1则是负数。

比如+0为0,0000000,-0为1,0000000

以下以8位二进制数为例,8位二进制数的组成分为符号位和数值位。第一个比特代表符号位,后七位代表数值位。

由于后七位数值最多为1111111,即127。因此8位的有符号数范围是-128-127。

对负数的操作

计算机对负数的使用得经过原码->反码->补码的换算。以下分别介绍原码,反码,补码的概念。

原码

定义:

与二进制相同,负数则将首位改为1

举例:

+15原码为:0,0001111

-15原码为:1,0001111

反码

定义:

若原码为正数时,和原码一样

若原码为负数时,符号位不变,其余位取反

举例:

+15的反码为:0,0001111

-15的反码为:1,1110000

补码

定义:

正数的补码与其原码相同;

负数的补码则取反码后加1。

举例:

+15的补码为:0,0001111

-15的补码为:1,1110001

解释:1,0001111(原码) -> 1,1110000 + 1(取反码 + 1) -> 1,1110001(补码)

总结

由于计算机只算加法,因此正数的原码,反码,补码都一样,而计算机对负数才进行原码变反码再变补码的操作。

运算时的转换

比如计算机要计算15-15,由于计算机只算加法,便会看成15+(-15)。

对于15,是正数,直接使用15的二进制0,0001111

对于-15,是负数,得通过原码->反码->补码的换算才能使用,因此使用-15的补码1,1110001计算。

于是15+(-15) = 0,0001111 + 1,1110001 = 100000000,取后八位00000000,即为0。