前导1表示签名int中的负数是从哪里出现的?

Kin*_*Jnr 6 math binary unsigned signed

即使我读过一些文章,说大多数2的补码用于表示有符号整数中的负数,这是最好的方法,

但是由于某些原因,我(在下面)这个(下面)卡在我的头脑中,在不知道它的历史的情况下无法摆脱它

"使用带符号的int时,使用前导位为1来表示负数."

我在网上和StakOverflow上看了很多帖子,2的补码是表示负数的最佳方式.但我的问题不是关于最好的方式,而是关于历史或"领先位"概念出现在哪里然后消失?

PS:也只是不是我,其他一些人也对此感到困惑.

编辑 - 1我在上面提到的一个例子中描述了所谓的前导1方法: 为什么两个补码用于表示负数?

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

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

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

Rant:我认为有很多团体/人都被教导或被认为(错误地)认为1011评估为-3.1表示 - 和011表示3.

那些问"我的问题是什么......"的人可能从他们学到的第一个实例中学到了正确的2的补充方式,并且没有接触到这些错误的答案.

Kei*_*son 4

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

现在我们假设 16 位。

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

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

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

请参阅维基百科了解更多信息。