Math 区分2';s补负数和相应的正数

Math 区分2';s补负数和相应的正数,math,binary,Math,Binary,我用下面的例子加以阐述。十进制5的4位二进制表示为0101。所以十进制-5在2的补码中表示为1011。然而,1011也是十进制11的二进制表示形式。如何区分这两者 如果解决方案是将4位二进制数限制为仅表示-8到+7,那么如何检测溢出?当我把二进制7和二进制7相加时,我得到1110,它是十进制13(溢出),但在2的补码中也是二进制2。如何检测二进制7+7是溢出,而不是-2 我知道计算机通常使用2的补码来表示负数。我想知道在这种情况下这个问题是如何处理的。没有办法区分具有相同表示形式的正数和负数。我

我用下面的例子加以阐述。十进制5的4位二进制表示为0101。所以十进制-5在2的补码中表示为1011。然而,1011也是十进制11的二进制表示形式。如何区分这两者

如果解决方案是将4位二进制数限制为仅表示-8到+7,那么如何检测溢出?当我把二进制7和二进制7相加时,我得到1110,它是十进制13(溢出),但在2的补码中也是二进制2。如何检测二进制7+7是溢出,而不是-2


我知道计算机通常使用2的补码来表示负数。我想知道在这种情况下这个问题是如何处理的。

没有办法区分具有相同表示形式的正数和负数。我制作了一些程序,利用这种模糊性来完成工作。正如您所说,通常的过程是说,其最高有效位(MSB)为
1
的二进制数为负,其最高有效位为
0
的二进制数为正。对于四位,它给出了从-8到+7的范围

此外,CPU检测溢出的一种方法是比较进入MSB的进位和从MSB出来的进位。如果这些位是相同的——都是零或都是一——那么就没有溢出。如果这些位不同,一个为零,另一个为一,则加法中存在溢出

在7加7或
0111+0111
的示例中,请注意,当您将
111
添加到
111
(不包括MSB的值)时,将得到
1110
,因此结果是
110
,并将
1
进位添加到MSB中。然后,当添加MSB和进位时,会看到
0+0+1
,它是
1
,并且没有执行MSB的进位。所以进位是
1
,进位是
0
,所以出现了溢出


许多CPU检测到这些情况。加法后,一个状态位将是MSB的进位,另一个状态位将是MSB的进位。如果这些位不同,则溢出条件标志将被提升。

仅查看这些位,不可能为相同的位序列分配不同的含义。无法区分字节
11111111
表示有符号
-1
还是无符号
255
,同样无法区分字节
00100001
表示数字
33
还是字符
'a'
。这些是对相同基础数据的不同解释。在现实世界中处理它的方式是类型的思想,这在几乎任何高级语言中都以某种方式得到支持。类型是允许选择一种解释而不是其他解释的东西。在许多更新和更高级的语言中,甚至没有简单的方法以其他方式解释相同的数据(字节);在一些低级语言(如C或C++)中,如果您有充分的理由这样做,您实际上可以这样做。例如,您可以获取一个8字节整数类型的数字
5217737203189443684
,其十六进制表示形式为
0x48 69 20 57 6F 72 6C 64
,并将其重新解释为一个字符序列
“Hi World”
。在一些情况下,这样的技巧会带来好处,但在大多数情况下,这不是你应该做的事情(这就是为什么你不能用很多语言轻松做到这一点)

回到你的例子,许多语言有不同类型的“有符号整数”和“无符号整数”,这就是区分这些情况的原因。至于溢出,2的补码的一个很好的特性是,在比特级别上,加法和减法的逻辑实际上对于“无符号整数”和“有符号2的补码整数”是相同的。因此,在硬件级别上,所需的只是检测溢出,设置相应的标志(和),然后将这些标志的解释留给用户。是
-127+-127
还是
129+129
?硬件不在乎。那是
-1+2
还是
255+2
?同样,硬件也不在乎。它只是设置标志,并允许您(或编译器)根据(逻辑)指定的类型来解释

注意:关于溢出和进位标志的一些详细信息可用

有一个。