0

如果在我的编译器上,int 是 16 位,那么它的范围是 -32768 到 32767(在 2 的补码机器中)。
我想知道为什么负数有1个额外的号码。即正数转到32767,但负数转到另外一个即32768。

-32768 如何在 2 的补码 m/c 上表示?

4

5 回答 5

6

在 16 位上,您可以拟合 pow(2,16)(2 的 16 次方)不同的组合来表示 65536 个数字。已决定零看起来最好在本地表示为 000...000 并且“二进制补码”系统中的正数通常是可读的(它们等于所谓的“自然二进制”表示,如 0000 0000 0000 0101 = 5 个十进制等) .

二进制补码中的负数以 1111 1111 1111 1111 开头,表示 -1。把它想象成一个带有数字 997、998、999 的计数器拨号,当它必须代表 1000 时,它突然溢出并显示 000。这里的原理是相同的,但方向是相反的——从 ...000到 ...111。-2 表示为 1111....1110 等等。

二进制补码中可能的最小数字前面为 1,其余数字为 0。

于 2010-07-03T08:36:54.557 回答
3

如果您正在寻找一个简单、脚踏实地的答案:

没有任何偏见。正数和负数的数量相等,正数从 0 开始,负数从 -1 开始,因此相差一。:)

于 2010-07-03T08:44:47.987 回答
1

真的没有任何“偏见”。当设置最高有效位时,该数字为负数。对于“正数空间”(即设置 MSB)以及 1-32767,您的值为零,因此明显缺少 32768。

-32768 将由 0b1000000000000000 表示。见链接文字

于 2010-07-03T08:35:15.997 回答
1

没有负零。(-0)。这就是为什么它似乎是一种偏见。如果设置了最后一位,则实际上它被认为是负数。一个字节中还有另外 7 位可以设置在正负范围内。

于 2010-07-03T08:49:52.063 回答
1

另一种思考方式是制作一个 1 位有符号变量。有符号意味着必须有负数,当然也会有正数。所以你可以有1个正数1个负数,你拍哪两个数字?现在让它变成 2 位,你画的是哪 2 个正面和负面?真正的秘密是最后一位代表否定。

Theres extra work if we want to consider 0 a negative number. and it would be wasteful to have a negative 0.

于 2010-07-03T09:15:39.880 回答