原码反码补码
1.机器数
机器数是将符号"数字化"的数,是数字在计算机中的二进制表示形式。机器数有两个基本特点:
1.数的符号数值化。在计算机中,所有数都是以二进制形式存储,第一位为符号位,以0代表符号"+",以1代表符号"-"。因为有符号占据一位,数的形式值就不是真正的数值,带符号位的机器数对应的数值称为机器数的真值。
2.二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。8比特位=1字节,机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。
2.原码
原码表示法是计算机中一种对数字的二进制定点表示方法。
最高位为符号位,其余位表示数值的大小。
+1 00000000 00000000 00000000 00000001
-1 10000000 00000000 00000000 00000001
3.反码
反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。
正数的反码与其原码相同。
负数的反码是在其原码的基础上符号位不变,数值位逐位取反.
-7 10000000 00000000 00000000 00000111 原码
11111111 11111111 11111111 11111000 反码
4.补码
在计算机中,二进制数以补码的形式存储,负数以其正值的补码形式存在。
补码是在原码的基础上末位加1。
-7 11111111 11111111 11111111 11111001 补码
5.原码反码补码的转换
正数原码反码补码都一样。
负数原码转换为反码,符号位不变,其他按位取反,反码转换为原码也是一样。
负数原码转换为补码:符号位不变,其他按位取反,末位再加1,即反码末位加1。
-7 10000000 00000000 00000000 00000111 原码
11111111 11111111 11111111 11111000 反码
11111111 11111111 11111111 11111001 补码
6.按位取反运算符~
计算机中所有数以其补码形式存储,所以一个十进制数按位取反的结果需要经过如下步骤:
十进制数➡原码➡补码➡按位取反变为另一个数的补码➡原码➡十进制数
如果只是想简单算出结果可以代入公式~X = -(X+1)
~7 00000000 00000000 00000000 00000111 ①原码即补码
11111111 11111111 11111111 11111000 ②按位取反后变成另一个数的补码
- 00000000 00000000 00000000 00000001 补码变反码,末位减1
11111111 11111111 11111111 11110111 ③反码
10000000 00000000 00000000 00001000 ④原码
所以~7 = -8
②➡④可以用上图中快速手算方法更方便快捷。这个计算过程只是手算展示,计算机中补码转原码应该同原码转补码步骤一样,毕竟减法电路实现起来更复杂。