wangtopia

王同学

二进制、原码、反码、补码

发布于 # 技术

二进制知识了解学习

超出数据类型给定范围的问题

例如:byte数据类型的范围是-128-127

public class Demo {
    public static void main(String[] args) {
//byte能接收的数值范围是-128-127
//给byte赋值为129会报错,但是可以进行强转。128有点特殊
        byte num = (byte) 129;
        //打印输出的结果是-127
        System.out.println(num);
    }
}

为什么会打印输出成-127呢,我们就需要了解一下二进制,原码,补码相关的一些知识。

二进制

我们最熟悉的是十进制,就是逢十进一。

由此可以推导出二进制的运算,就是逢二进一。

二进制就是由0和1组成的。我们前面讲过数据在内存中存储的形式就是二进制的。

学习二进制有助于我们学习底层的东西,尤其是底层中的变量,以及二进制和其他进制相转换,如二进制,十进制,八进制,十六进制之间的转化。

什么是二进制?

二进制就是由0和1组成的数字序列。

不管什么数字转换成二进制都是0和1组成的。对于计算机而言,数据的存储都是二进制的形式。

十进制二进制十进制二进制
001710001
11
2103111111
31132100000
410033100001
5101
611063111111
7111641000000
81000651000001
91001
1271111111
15111112810000000
1610000

我们可以发现如下规律:

二进制转换为十进制

举个栗子:对于二进制数1011

十进制转换为二进制

总结:“除以2,余数逆序排列”

举个栗子:

img

以后用的时候可以用工具直接转,但是现在要明白是什么。

原码,反码,和补码的案例分析

原码反码和补码

  1. 这是很重要的基础知识,后面如果学JDK源码知识的时候,我们会发现里面就用到了这些。

  2. 区分正数和负数

原码

  1. 正数

因为正数的绝对值还是它本身,所以正数的原码,反码和补码都是一样的,也就是它本身的二进制数。

  1. 负数

先介绍一下什么是符号位:

反码

反码是在原码的基础上改变而来的!

  1. 什么是反码?

-5的原码:1000 0101

-5的反码:1111 1010

补码

  1. 原码->反码->补码:他们都是依据前一个进行改变的。

  2. 补码的出现主要是解决负数的计算,计算机中存储的都是二进制的补码

  3. 什么是补码呢?

扩展问题

byte num = (byte) 129 ; 为什么输出结果是-127?

我们来自己求一下:

  1. 129是个正数,所以它的原码、反码、补码都是一样的。

  2. 129的二进制(原码、反码、补码):1000 0001

  3. 无论是正数还是负数,他们在计算机当中的存储形式都是以补码的形式。因为对于负数,负数在计算机中的存储形式是补码的形式的,我们为了统一,我们可以说成正数和负数在计算机中都是补码的形式,因为正数对于原码反码补码都是一样的。

  4. 对于129是超出byte的范围的,如果用short存储,short是2个字节,就可以存储:0000 0000 1000 0001。最高位就是0代表正数。

  5. 但是现在强制转为8位,就变成了 1000 0001.这个就是它的补码。

补码:1000 0001 求反码(反码最后一位+1而来,补码最后一位减一回去)

反码:1000 0000 求原码(原码除了符号位取反而来,反码除了符号位取反回去)

原码:1111 1111

这个数的绝对值的二进制数(把最高位换成0):0111 1111

转为十进制是:127 .但是这个是这个数的绝对值的二进制数,我们知道补码的最高位是1,所以是个负数。输出就是-127。

小试牛刀

  1. 130

现在强制转换为8位:1000 0010(补码);

补码:1000 0010

反码:1000 0001

原码:1111 1110

  1. 128

补码:1000 0000

反码:0111 1111

原码:0000 0000

快速求一个负数的补码

如果我们能用公式快速把一个负数的补码求出来的话,那反过来,如果我们知道这个数的补码的话,我们就可以根据公式,反推出这个负数是多少了。

公式

公式:模+(该负数) = 该负数补码的绝对值数

用8位存储的话,这个模就是256

  1. 现在反过来:现在想打印byte 129的数是多少

小试牛刀

  1. byte 130

130 - 256 = -126

  1. byte 128

128-256 = -128

微信赞赏码微信
支付宝赞赏码支付宝