计算机中的源码、反码、补码。

首先,我们先看一段代码:

public class TestDemo02 {
    public static void main(String[] args) {
        int num1 = 4;
        int num2 = -4;
        System.out.println(Integer.toBinaryString(num1));
        System.out.println(Integer.toBinaryString(num2));
    }
}

这段代码是要打印num1和num2的二进制表示,我们看下结果:

 

4很理解,100 = 1*2^2+0*2^1+0*2^0=4,但是-4 为什么是11111111111111111111111111111100来表示??

这里,我们就需要了解计算机中数据是如何存储的。

一、基本定义

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以用补码统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

  1. 原码:二进制表示。二进制首位是符号位,0为正,1为负
  2. 反码正数,反码和原码一样;负数,符号位不变,其他各位取反
  3. 补码正数,补码和原码一样;负数,反码末位加1,有进位则进位,但不改变符号 

        按照这个定义,我们看下-4是怎么表示的。

        -4的原码,符号位为1表示负数

10000000 00000000 00000000 00000100

      -4的反码,符号位不变,其他各位取反

11111111 11111111 11111111 11111011

    -4的补码,反码的末位加1,符号位不变

11111111 11111111 11111111 11111100

所以,我们看到跟java 运行输出的结果是一致的。

二、负数的位运算

正数的原码、反码、补码都一样,直接运算即可,负数的位运算需要转换成补码运算后再转成原码。

例如:

-4<<2

     ① -4的原码,符号位为1表示负数

10000000 00000000 00000000 00000100

     ② -4的反码,符号位不变,其他各位取反

11111111 11111111 11111111 11111011

    ③ -4的补码,反码的末位加1,符号位不变

11111111 11111111 11111111 11111100

    ④对补码进行左移两位(最高位不变,次高两位去掉,末尾两位补0)

11111111 11111111 11111111 11110000

   ⑤取反码,-1

11111111 11111111 11111111 11101111

    ⑥原码,最高位不变,其他位去反

10000000 00000000 00000000 00010000

  换算成十进制就是-16.

我们用程序验证下:

public class TestDemo02 {
    public static void main(String[] args) {
        int num2 = -4;
        System.out.println(num2<<2);
    }
}

输出结果:

 

 

因此,总结下,涉及到负数的位运算,计算过程:

 

 

扩展阅读:为什么需要反码?

https://blog.csdn.net/chenchao2017/article/details/79733278

 

posted @ 2020-10-18 16:26  Danny·茄子  阅读(561)  评论(0)    收藏  举报