原码反码补码

关于原码、反码和补码

首先了解机器数和机器数的真值。

机器数和机器数的真值

1、机器数

数字在计算机中的二进制表现形式。

  • 符号数值化:数据的正负号,在机器里用一位二进制的0或1来区别。通常这个符号放在二进制数的最高位(称符号位),用0代表符号“+”,用1代表符号“-”。
  • 二进制的位数受机器设备的限制。机器内部设备一次能表示的二进制位数叫机器字长。一台机器的字长是固定的(如8位、16位、32位、64位)。
    1
    2
    3
    比如在字长为8的计算机中。
    十进制的+5,其机器数为:00000101
    十进制的-5,其机器数为:10000101

2、机器数的真值

机器数有符号占据一位,所以机器数的形式值就不等于真值。

1
2
3
例如机器数:10000101
最高位1表示“-”,则真值数为-0000101,十进制真值为-5
真值是不计算符号位的(第一位不表示值,只表示正负)。

机器数的三种形式

1、原码

原码:将数的真值形式中“+”用0表示,“-”用1表示。

1
2
+5原码:00000101
-5原码:10000101

加减法运算复杂。

2、反码

正数的反码与原码相同;负数的反码是对其原码数值位(不包含符号位)逐一取反。

1
2
+5原码:00000101   反码:00000101
-5原码:10000101 反码:11111010

3、补码

正数的补码与原码相同;负数的补码是符号位不变,其余位取反,再末位+1(相当于反码末位+1)。

1
2
+5原码:00000101   反码:00000101    补码:00000101
-5原码:10000101 反码:11111010 补码:11111011

数据在计算机中是以其补码形式存储和运算的。

  • 补码运算时,其符号位与数值部分一起参与运算。
  • 补码运算时,其运算结果仍为补码。(在转换为真值时,若符号位为 0,数位不变;若符号位为 1,应将结果求补才是其真值。)

java转换二进制:

1
2
3
//Integer.toBinaryString()
System.out.println(Integer.toBinaryString(5)); //输出101
System.out.println(Integer.toBinaryString(-5)); //输出11111111111111111111111111111011

二进制数的四则运算

  • 加运算:0+0=0;1+0=1;0+1=1;1+1=10(逢2进1)。
  • 减运算:1-1=0;1-0=1;0-0=0;0-1=1(向高位借1当2)。
  • 乘运算:0 * 0=0;0 * 1=0;1 * 1=1。
  • 除运算:1除以1=1;0除以1=0。

推荐文章