二进制补码与负数、算术右移与逻辑右移

683 阅读3分钟

二进制补码与负数

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战 计算机通常以二进制补码的表示形式存储整数。正数表示为自身,而负数表示为其绝对值的二进制补码(其符号位为1,表示负值)。N位数(N是数字的位数,不包括符号位)的二进制补码是相对于2^N的数字的补码。

以4位整数-3为例。如果它是一个4位数,我们使用1个数位表示符号,3个数位表示值。我们需要相对于2^3(即8)的补码。在相对于8的情况下,3(-3的绝对值)的补码是5。5用二进制表示为101。因此,二进制中的-3表示为4位数则为1101,其中第一位是符号位。

换句话说,-KK的负值)作为N位数的二进制表达式为concat(1, 2***N-1*** - K)

另一种处理这种情况的方法是,可以反转正数表达中的每个数位,然后再加1。3表示为二进制数是011。翻转所有数位得到100,加1后得到101,然后加上符号位(1)可以得到1101。

在4位整数中,该过程可以表示如下。

正值负值
70 111-11 111
60 110-21 110
50 101-31 101
40 100-41 100
30 011-51 011
20 010-61 010
10 001-71 001
00 000

请注意,左侧与右侧整数的绝对值相加总等于2^3。同时,除了符号位以外,左侧与右侧的二进制值总是相等。为什么是这样呢?

算术右移与逻辑右移

有两种类型的右移操作符。算术右移基本上等同于将数除以2。逻辑右移则和我们亲眼看到的移动数位的操作一致。最好可以通过负数进行描述。

在逻辑右移中,我们移动数位,并将0置于最高有效位。该操作用>>>操作符表示。在8位整数(符号位是最高有效位)的情况下,该过程如下图所示,其中,符号位用灰色背景表示。

在算术右移中,我们将值移动到右边,并使用符号位值填充新的数位。这(大致)相当于将数除以2。该操作用>>操作符表示。

对于参数x = -93 242 以及count= 40?,你认为下面的函数该如何操作?

通过逻辑移位,我们最终会得到0,因为我们不断地将数位0移入最高位。

通过算术移位,我们最终会得到-1,因为我们不断地将数位1移入最高位。一串1构成的(有符号)整数表示-1。