带符号的int或二进制数字
零被视为正号
和
1被视为负号。
例如 :-
1000 0000 0000 0110 = -6
0000 0000 0000 0110 = 6
但是在脉冲形式中,将1视为正,将0视为中性。
--- --- ---
| | | | | |
--------- --- --- ---------
为什么?它背后有逻辑吗?
并可能以相反的方式处理它,即1表示正号,0表示负号
您最初的断言并不是真的,不是针对绝大多数使用通用的CPU体系结构-它们使用“二进制补码算法”。
在2的补码算法中,如果高阶位为1,则表示负数;否则为0。但是如果高阶位为0,则不表示正数。它表示非负数。差异是微妙的,但很重要。该数字可以为零,也可以为正数。
在2的补码中,数字比例看起来像这样-为了简单起见,我将使用八位整数:
二进制有符号无符号 01111111 127 127 01111110 126 126 ... 00000011 3 3 00000010 2 2 00000001 1 1 00000000 0 0 11111111 -1 255 11111110 -2 254 ... 10000010 -126 130 10000001 -127 129 10000000 -128 128
要在该系统中求反(算术求逆),即乘以-1:首先反转所有位,然后加1。因此,如果我们以1开头,然后反转位,则得到11111110。加1,我们有11111111。如上所述。请注意,如果再次执行此操作,则应返回到00000001。
计算机之所以使用此系统,是因为它使加法,减法等算术逻辑非常简单:相同的逻辑(简单的二进制加法器;您只需将所有位(包括符号位)相加)就适用于有符号数和无符号数。请注意,在该比例尺上将1加到任何数字上都会使您获得正确的答案...溢出情况除外:如果您将数字解释为带正负号,则在1到127之间加1会得到-128。但是溢出和进位等通常被条件标志或异常捕获。
我们有一个比我们有正数多的负数是一个奇数的补码怪癖。.因为零既不是负数也不是正数。因此,使用带符号的八位,我们可以表示-128,但不能表示+128。+127是最高正数。这不是什么大问题。
已经建立了一些使用“一个人的补品”的历史计算机(CDC 3000和6000系列,以及一些旧的Univac大型机;我不知道有任何现代示例)。作为补充,要反转数字,只需翻转位。除了负边从-127到... -0之外,这几乎与上面的结果相同。是的,在一个人的心目中。在机器上,您有两个零:正零和负零。这使得算法通常更加复杂。负零通常会在某个时刻转换为正。
您可能会认为它应该更像是“有符号的幅度”,这与我们通常写数字的方式类似。例如-2将是10000002。您会注意到,在该值上加上1不会为-1提供正确的带符号幅值表示。它给您-3。这使算法变得更复杂,这就是为什么不使用它的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句