math - 有符号整数中的前导 1 表示负数从何而来?

标签 math binary unsigned signed

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

然而,出于某种原因,我把这个(下面)卡在了我的脑海里,在不知道它的历史的情况下无法摆脱它

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

我在网上和 StakOverflow 中阅读了许多帖子,认为 2 的补码是表示负数的最佳方式。但我的问题不是关于最好的方法,而是关于历史或“前导位”概念从哪里出现然后消失?

P.S:也不是我,很多其他人也对此感到困惑。

编辑 - 1
我提到的所谓的领先 1 方法在这篇文章中用一个例子来描述:
Why is two's complement used to represent negative numbers?

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

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

谢谢:
jamesdlin, Oli Charlesworth, Mr Lister 提出恳求的问题让我意识到正确的答案。

咆哮:
我认为有很多团体/人被教导或被(错误地)认为 1011 评估为 -3。 1 表示 - 和 011 表示 3。

那些问“我的问题是什么……”的人可能从他们第一次学习时就被教导了正确的 2 的补码方式,并且没有接触到这些错误的答案。

最佳答案

有符号整数的二进制补码表示有几个优点。

现在让我们假设 16 位。

0 到 32,767 范围内的非负数在有符号和无符号类型中具有相同的表示形式。 (二进制补码与二进制补码和符号和大小共享此功能。)

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

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

Wikipedia想要查询更多的信息。

关于math - 有符号整数中的前导 1 表示负数从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10425979/

相关文章:

algorithm - 快速确定数字是否整除集合中的任何元素

c++ - 商运算符赋值?

algorithm - 用迭代、替换、主定理解决递归问题?

algorithm - 解决旅行推销员的复杂递归关系

android - 如何生成app-androidTest-unaligned.apk

python - 二进制补码函数输出 -1 的错误结果

c - C中的十进制转二进制算法

java - 在java中打印二进制数的十进制等价物

java - Java 8 中处理 "unsigned"整数的想法

java - Java 中的无符号长整型