【发布时间】:2010-05-28 18:39:59
【问题描述】:
32 位有符号整数如何表示负数? 是补码还是补码?或者左边的最后一位就像一面旗帜? 例如:(-10)
【问题讨论】:
-
在什么情况下?不同的系统/平台会做不同的事情。
-
你的意思是“左边的第一位”吗?
32 位有符号整数如何表示负数? 是补码还是补码?或者左边的最后一位就像一面旗帜? 例如:(-10)
【问题讨论】:
如今,大多数计算机使用 two's complement 表示有符号整数,但它可能因硬件架构、编程语言或其他特定于平台的问题而异。
对于二进制补码表示,最高有效(“最左边”)位称为符号位,它将被设置为负整数并清除非负整数。然而,它不仅仅是一面“旗帜”。请参阅Wikipedia article 了解更多信息。
【讨论】:
通常是补码。
【讨论】:
来自 C99 标准:
对于有符号整数类型,位 对象表示应为 分为三组:值位, 填充位和符号位。那里 不必是任何填充位;那里 应该是一个符号位。每个 作为值位的位应具有 相同的值作为相同的位 的对象表示 对应的无符号类型(如果有 是有符号类型的 M 值位 和 N 为无符号类型,则 M = N)。如果符号位为零,则应 不影响结果值。如果 符号位为 1,值应为 通过以下方式之一进行修改:
——带符号的对应值 位 0 取反(符号和大小);
——符号位的值为 -(2N) (二进制补码);
——符号位的值为 -(2N - 1) (一个补码)。
以下哪项适用 实现定义,是否 符号位 1 和所有的值 值位为零(对于前两个), 或带有符号位和所有值位 1 (对于一个的补码),是一个陷阱 表示或正常值。在 符号和大小的情况和 一个的补码,如果这个 表示是一个正常值 称为负零。
【讨论】:
我认为答案是0110,前面有 1 重复 28 次,因此它看起来像:
1111 1111 1111 1111 1111 1111 1111 0110;
步骤:
10 的位表示为:
0000 0000 0000 0000 0000 0000 0000 1010;
0->1 和 1->0 表示所有位:
1111 1111 1111 1111 1111 1111 1111 0101;
将最后一位加 1,并传播到前面的位,完成!
1111 1111 1111 1111 1111 1111 1111 0110;
===
您可以通过将其与 10 相加来验证,您将得到所有位的 0。如上所述,它是从 2 开始的,并且遵循二进制补码。
【讨论】:
0xFFFFFFFF = -1
0xFFFFFFFE = -2
0xFFFFFFFD = -3
...
等等
【讨论】:
最高有效位(左侧最后一位)设置为负数。
【讨论】:
仅供参考:negation -> adding one。
以5为例,8位,引用自wiki
to convert 5 to -5: 0000 0101 - flip -> 1111 1010 - add one -> 1111 1011
有一个技巧可以将数字从正数转换为负数,反之亦然:
忽略它们的符号位(最左边的位)添加它们会给你2^N(其中 N 是表示数字的位数)。
如上面 8 位 表示中的示例,5 (0000 0101) 和 -5 (1111 1011) 的总和将为您提供 1 0000 0000,即 (2 ^ 8)。
【讨论】: