二进制补码与负数
这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战。
计算机通常以二进制补码的表示形式存储整数。正数表示为自身,而负数表示为其绝对值的二进制补码(其符号位为1,表示负值)。位数(
是数字的位数,不包括符号位)的二进制补码是相对于
的数字的补码。
以4位整数-3为例。如果它是一个4位数,我们使用1个数位表示符号,3个数位表示值。我们需要相对于(即8)的补码。在相对于8的情况下,3(-3的绝对值)的补码是5。5用二进制表示为101。因此,二进制中的-3表示为4位数则为1101,其中第一位是符号位。
换句话说,(
的负值)作为
位数的二进制表达式为
concat(1, 2***N-1*** - K)。
另一种处理这种情况的方法是,可以反转正数表达中的每个数位,然后再加1。3表示为二进制数是011。翻转所有数位得到100,加1后得到101,然后加上符号位(1)可以得到1101。
在4位整数中,该过程可以表示如下。
| 正值 | 负值 | ||
|---|---|---|---|
7 | 0 111 | -1 | 1 111 |
6 | 0 110 | -2 | 1 110 |
5 | 0 101 | -3 | 1 101 |
4 | 0 100 | -4 | 1 100 |
3 | 0 011 | -5 | 1 011 |
2 | 0 010 | -6 | 1 010 |
1 | 0 001 | -7 | 1 001 |
0 | 0 000 |
请注意,左侧与右侧整数的绝对值相加总等于。同时,除了符号位以外,左侧与右侧的二进制值总是相等。为什么是这样呢?
算术右移与逻辑右移
有两种类型的右移操作符。算术右移基本上等同于将数除以2。逻辑右移则和我们亲眼看到的移动数位的操作一致。最好可以通过负数进行描述。
在逻辑右移中,我们移动数位,并将0置于最高有效位。该操作用>>>操作符表示。在8位整数(符号位是最高有效位)的情况下,该过程如下图所示,其中,符号位用灰色背景表示。
在算术右移中,我们将值移动到右边,并使用符号位值填充新的数位。这(大致)相当于将数除以2。该操作用>>操作符表示。
对于参数x = -93 242 以及count= 40?,你认为下面的函数该如何操作?
通过逻辑移位,我们最终会得到0,因为我们不断地将数位0移入最高位。
通过算术移位,我们最终会得到-1,因为我们不断地将数位1移入最高位。一串1构成的(有符号)整数表示-1。