由于基础知识不牢进行补脑
以下举例无特殊说明,都是以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 反码为11111110,需要注意的是符号位。
补码
补码的定义:
正数的补码为原码。
负数的补码为原码的反码 + 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 是多少呢?