最终用户如何确定11101100是236还是-20?我知道你可以始终检查最高有效位,但这总是100%准确的吗?负二进制数的惯例是使最高有效位表示符号吗?
附注: 为什么我们要学习二进制减法,当我们可以做以下操作: 将二进制转换为十进制->减去十进制->重新转换为二进制
“在负二进制数中,最高有效位是否表示符号的约定?”
用二进制表示负数有多种方法,其中最常见的是您正在学习的二进制补码表示法。在该系统中,如果0与正数分组,则最高位将表示数字的符号。
在标准无符号二进制中,数字由位置表示法中的比特序列表示(为简洁起见,我只使用三个比特):
b2b1b0 = 22b2 + 21b1 + 20b0 = 4b2 + 2b1 + b0
1112 = 710
1102 = 610
1012 = 510
1002 = 410
0112 = 310
0102 = 210
0012 = 110
0002 = 010
二进制补码
有多种方法可以看待二进制补码,我认为所有方法的答案都很明显。 获得此系统的一种方法是将无符号数字的顶半部分(所有数字的高位均设置)移至零以下:
您可以清楚地看到高位表示符号。再次说明,0占用了4个正数表示中的一个,这导致范围不对称:[3,-4](尽管有时最负值被认为是特殊的,使得可用范围对称)。同样,我们可以重新解释最高位作为负数:0112 = 310
0102 = 210
0012 = 110
0002 = 010
1112 = -110
1102 = -210
1012 = -310
1002 = -410
0 11 2 = + 3 10
0 10 2 = + 2 10
0 01 2 = + 1 10
0 00 2 = + 0 10
1 00 2 = - 0 10
1 01 2 = - 1 10
1 10 2 = - 2 10
1 11 2 = - 3 10
过量-n
过量-n实际上更像是一组系统。所有的值都会向上移动n个单位(被称为偏置),然后像无符号的情况一样表示。如果选择正确的偏置,那么前导位可能表示符号,尽管极性与上述系统不同(并且0可以与负数或正数中的任意一个分组)。这仍然用于IEEE浮点数的指数。对于n = 3,高位确实表示符号,并且0会与负数分组:
b2b1b0 = 4b2 + 2b1 + b0 - n
1112 = 410
1102 = 310
1012 = 210
1002 = 110
0112 = 010
0102 = -110
0012 = -210
0002 = -310
Others
还有其他更为晦涩的整数表示方法,例如平衡三进制、负二进制或(可以说是)二进制编码十进制(BCD缩写)。之所以说BCD是可以争议的,是因为现代处理器通常仍然支持它(尽管这不是数字的内部表示方式),而且许多计算器过去都是基于它的。在这些系统中,高位(或三进制位或基n位数)可能会或可能不会指示符号(或在某些情况下指示它,在其他情况下则不会)。
"最终用户如何确定11101100是236还是-20?"
一般来说,没有办法确定存储在寄存器或存储器中的数字实际上是表示为二进制补码还是无符号数,正如其他人指出的那样。您必须跟踪它的使用方式才能确定这一点。
但是,如果该数字是直接存储在机器代码指令中的立即值,则操作码可以指示它是否有符号(具体取决于体系结构)。这可能会更改例如处理溢出的方式,或者是否执行符号扩展。
例如,可能会有单独的“加载立即”和“加载带符号立即”指令,用于将立即值复制到较大的寄存器中,第二个执行符号扩展,第一个则不执行。 “Branch”指令通常具有带符号立即数以指示跳跃的大小(以便前向和后向分支都可以使用单个指令)。可能存在不同的“添加立即”和“添加无符号立即”指令,用于根据加法类型设置适当的溢出标志。
符号扩展
符号扩展意味着复制高位以保留二进制补码数字的值。这将产生错误的结果,适用于一半的无符号数字。
未执行符号扩展:
1002 = 000001002
无符号数:410 = 410
有符号数:-410 = 410
进行符号扩展:
1002 = 111111002
有符号数:-410 = -410
无符号数:410 = 252100012 = 000000012
有符号数和无符号数:110 = 110
溢出(Overflow)
两个数字相加或相减的结果可能太大(绝对值)而无法正确表示。对于有符号数,相同的二进制序列相加可能会导致溢出,但对于无符号数则不会(反之亦然)。
有符号数溢出但无符号数不会:
0112 + 0112 = 1102
有符号数:310+310 = -210
无符号数:310+310 = 610
无符号数溢出但有符号数不会:
1112 + 0102 = 0012
无符号数:710 + 210 = 110
有符号数:-110 + 210 = 110
在二进制补码表示法中,最高位始终表示符号。但是,您必须知道字段宽度,并且还必须知道是否使用了二进制补码表示法。例如,如果11101100是一个32位数字,则最高有效位为0,因此它是+236。如果它是一个无符号的8位整数,则是+236,因为无符号数字不使用二进制补码表示法(只有带符号的数字才使用)。
在计算机中,加减运算是以二进制形式进行的。因此了解二进制加减运算对于理解计算机工作原理非常有用。