Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 带符号整数中的前导1表示负数是从哪里产生的?_Math_Binary_Unsigned_Signed - Fatal编程技术网

Math 带符号整数中的前导1表示负数是从哪里产生的?

Math 带符号整数中的前导1表示负数是从哪里产生的?,math,binary,unsigned,signed,Math,Binary,Unsigned,Signed,尽管我读过很多文章说,大多数情况下2的补码用于表示带符号整数中的负数,这是最好的方法 然而,由于某种原因,我的脑子里一直想着这个(见下图),如果不知道它的历史,我就无法摆脱它 “使用有符号整数时,使用前导位作为1表示负数。” 我在网上读过很多帖子&在斯塔科沃夫,2的补码是表示负数的最好方法。但我的问题不是关于最好的方式,而是关于历史或“领先位”概念是从哪里产生然后消失的 另外,也不是我,其他一些人也对此感到困惑 编辑-1 我提到的所谓的leading 1方法在本文中以一个例子进行了描述: 现在

尽管我读过很多文章说,大多数情况下2的补码用于表示带符号整数中的负数,这是最好的方法

然而,由于某种原因,我的脑子里一直想着这个(见下图),如果不知道它的历史,我就无法摆脱它

“使用有符号整数时,使用前导位作为1表示负数。”

我在网上读过很多帖子&在斯塔科沃夫,2的补码是表示负数的最好方法。但我的问题不是关于最好的方式,而是关于历史或“领先位”概念是从哪里产生然后消失的

另外,也不是我,其他一些人也对此感到困惑

编辑-1 我提到的所谓的leading 1方法在本文中以一个例子进行了描述:

现在我明白了,1的MSB表示负数。这是2的补充性质,而不是任何特殊方案

如果不是第一位,我们不能说1011代表-5还是+11

感谢: 詹姆斯德林,奥利·查尔斯沃思,李斯特先生,感谢他提出恳求性的问题,让我意识到正确的答案

咆哮: 我认为有一群人被教导或被要求(错误地)认为1011的计算结果为-3。1表示-和011表示3


问“我的问题是什么…”的人可能从一开始就学会了正确的2的补码方式,他们没有接触到这些错误的答案。

比如说,你不使用前导位。例如,在8位有符号字符中

11111111

代表-1。您可以测试前导位以确定它是否为负数

使用2的补码有很多原因,但第一个也是最大的原因是方便。取上面的数字加2。我们的结局是什么

00000001

基本上你可以免费加减2的补码。这在历史上是一件大事,因为逻辑非常简单;您不需要专用硬件来处理签名数字。你使用更少的晶体管,需要更少复杂的设计,等等。这可以追溯到8位微处理器之前,它甚至没有内置乘法指令(甚至许多16位微处理器都没有,比如苹果IIe和超级网元中使用的65c816)


也就是说,对于2的补码,乘法也相对简单,所以这没什么大不了的。

对于有符号整数,2的补码表示法有几个优点

现在让我们假设16位

0到32767之间的非负数在有符号和无符号类型中具有相同的表示形式。(二的补码与一的补码、符号和大小相同。)

二的补码很容易在硬件上实现。对于许多操作,可以对有符号和无符号算术使用相同的指令(如果您不介意忽略溢出)。例如,-1表示为
1111111111111111
,+1表示为
0000 0000 0001
。如果添加它们,忽略高阶位是符号位这一事实,则数学结果为
1 0000
;除去低阶16位以外的所有位,将得到正确的有符号结果。将同一操作解释为无符号,您将添加
65535+1
,并获得
0
,这是正确的无符号结果(带环绕模65536)

您可以将前导位视为另一个值位,而不是“符号位”。在无符号二进制表示中,每一位表示0或1乘以位值,总值是这些乘积的总和。最低位的位置值是1,下一个较低的位是2,然后是4,以此类推。在16位无符号表示中,高阶位的位置值是
32768
。在16位有符号二补表示中,高阶位的位值为
-32768
。试着举几个例子,你会发现一切都很好


有关更多信息,请参阅。

好吧,它的工作方式必须是
2加-2
等于零。早期的CPU有硬件加法和减法,有人注意到通过对所有位(一的补码,原始系统)进行补码来改变值的“符号”,它允许现有加法硬件正常工作,但有时结果为负零。(0和0的区别是什么?在这些机器上,它是不确定的。)

有人很快意识到,通过使用两个补码(通过反转位并加一来转换正负数),可以避免负零问题

所以实际上,受负片影响的不仅仅是符号位,还有除LSB之外的所有位。但是,通过检查MSB,可以立即确定那里的有符号值是否为负值。

补码(包括十进制的9补码、机械计算器/加法器/收银机等)一直存在。例如,在带有四个十进制数字的九补码中,0000..4999范围内的值为正,而5000..9999范围内的值为负。有关详细信息,请参阅

这直接产生二进制中的1s补码,在1s和2s补码中,最上面的位充当“符号位”。这并不能准确地解释计算机是如何从一的补语变成二的补语的(顺便说一句,当我把它们拼写成带撇号的单词时,我使用了克努斯的撇号惯例)。我认为这是运气和“负零”的刺激的结合,以及一个人的补码需要端到端携带的方式(与两个人的补码相比,不需要端到端携带)

从逻辑上讲,您使用哪个位来报告并不重要
  10 + 
 111
____
1001
1001 -
  10
____
 111
     10 -
    111
_______
...1011
...00000010
...00000111
___________
...11111011