计算机 原码 反码 补码

由于基础知识不牢进行补脑

以下举例无特殊说明,都是以8位为例。

符号位

符号位定义:在内存寄存器最高位定义为符号位,1表示负数、0表示正数。

举例:在byte中一共有8个位。

0000 0001   表示的是正数最高位为 0 即是
1000 0001   表示的是负数最高位为 1 即是

原码

原码定义:

0000 0001   表示 +1的原码
1000 0001   表示 -1 的原码

反码

反码的定义:
正数的反码是其本身
负数的反码,除符号位外取反。

举例:
[+1]  0000 0001 反码为 0000 0001
[-1]   1000 0001 反码为 1111 1110,需要注意的是符号位。

补码

补码的定义:
正数的补码为原码
负数的补码为原码的反码 + 1

举例:
+1 的原码为 0000 0001,
+1 的反码为 0000 0001,
+1 的补码为 0000 0001.

-1  的原码为 1000 0001,
-1  的反码为 1111 1110,
-1  的补码为 1111 1111.

以上是关于 原码、反码、补码的定义。

那么计算机为什么用 原码、反码、补码呢?原因是减法,具体详情

计算机在存储整数时,储存的都是整数的补码。
计算机在存储整数时,储存的都是整数的补码。
计算机在存储整数时,储存的都是整数的补码。

这是数学科学家为解决减法问题,在CPU中使用加法器而设计的补码,实现减法。

下面用4个位做介绍,原理都是一样的,不想用8位介绍的原因是,字面上过多的0或1给视觉造成干扰。
对于计算机中的二进制,最高位是 0,我们知道这个数是正整数,可以计算出这个数的十进制。
例如:0010,计算十进制为(最高位为符号位,不参与运算) 0*2^2 + 1*2^1 + 0*2^0 = 2

因为正数原码反码补码定义为本身,可以用上面计算方法得出十进制值,
可是对于一个负数呢?

例如:‭1110,首先最高位为1,可以判定这个数为负数,并且这个二进制在计算机中是一个负数的补码,所以不容易从表面直观看出这个数的十进制,所以要转换成原码。

负数的补码 = 原码->补码(取反码 + 1)
负数的原码 = 补码 >补码(取反码 + 1)

求补码的原码(以下例子是一个负数的补码)
反码 :
        1110 ‬
        1001
加1:
        1001
        1010
最终得到原码 1010,最高位为1表示是负数,后面的三位二进制是 010,
010 计算十进制为(最高位为符号位,不参与运算) 0*2^2 + 1*2^1 + 0*2^0 = 2,因为最高位为1,
所以1110的十进制是 -2

二进与十六进制

以下是个人的方便记忆的快速理解,不代表科学性,仅供参考。
用十六进制表示负数
在 4位中 -1 的补码为 1111,
1111 所有位计算值为 1*2^3+1*2^2+1*2^1+1*2^0 = 15 = 0XF(十六进制)
在 8位中 -1 的补码位 1111 1111,那么十六进制为 0XFF

 

思考

1000 0000 是多少呢?

你可能感兴趣的:(Assembly,开发语言)