Loading

整数的二进制表示

整数的二进制表示

整数的二进制表示,需要区分正整数和负整数来看。

正整数的二进制表示

看正整数的二进制表示,就要先了解一下位权

十进制、二进制都有位权。以 123 为例:123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0。每个位置的位权都不一样,十进制从右到左,以 1 开始,依次乘 10 。也就是说第 1 位为 1 ,第 2 位为 10,第 3 位为 100。

那么二进制怎么表示 123 呢?二进制中,每个位置只能有两个数字:0 和 1。位权的表示和十进制中的相似,从右到左,以 1 开始,依次乘2。也就是说,第一位是 1,第二位是 2,第三位是 4。那么十进制123 用 二进制表示就为:

0111 1011

它的表示其实是:

0111 1011 = 0 * 2^7 + 1 * 2^6 + 1 * 2^5 + 1* 2^4 + 1 * 2^3 + 0 * 2^2 + 1 ^ 2^1 + 1 * 2^0

负整数的二进制表示

负整数的二进制表示,是对它对应的正整数的二进制,进行补码运算:

求 -123 的二进制表示:
1. 求 123 的二进制表示:0111 1011
2. 对 1 的结果进行补码运算(取反加1):1000 0101,这个就是 -123

可以验证一下 0111 1011 + 1000 0101 的结果是 0000 0000。

负整数的二进制为什么要用补码表示?

因为只有这种形式,计算机才能实现正确的加减法。计算机其实只能做加法,也就说,在计算机中,1-1 其实是1+(-1)。如果用原码表示,计算结果是不对的。

符合直觉的方式表示负整数(高位变为1):

1  -->  0000 0001
-1 --> 1000 0001
-----------
-2 --> 1000 0010

1 - 1 = -2,结果不对。

使用补码表示后:

1  -->  0000 0001
-1 -->  1111 1111
-----------
0 --> 0000 0000

1 - 1 = 0,结果正确。

整数的运算结果为什么出现负数

理解二进制加减法后,就可以理解正数的运算结果为什么会出现负数:

        byte a = 127;
        byte b = 1;
        byte c = (byte) (a + b);
        // -128
        System.out.println(c);

输出为 -128,与我们预期的 128 不一致。

运算过程如下:

0111 1111  
+
0000 0001
-----------
1000 0000 (byte 在内存中只占 8 位,首位位 1,会被认为是负数,所以结果是 -128)

由于 byte 在内存中占 8 位,首位为 1,会被认为是负数,所以输出的结果是 -128。

总结

整数的二进制表示,需要区分正整数和负整数。求负整数的二进制表示时,需要将其对应正整数的二进制进行补码运算。

只有进行补码运算,才能保证二进制加减法正确。

理解二进制加减法后,就可以理解为什么整数的运算结果会出现负数,计算机会将首位为 1 的二进制数当作负数,在我们存放数据的数据结构位数不足以容纳我们数据时,就可能会出现预期结果和计算结果不一致的情况。

posted @ 2022-05-17 09:06  walkkong  阅读(1059)  评论(0编辑  收藏  举报