3

C是否定义整数的二进制表示,例如一个,二进制补码......或者这个表示处理器(计算机或其他东西)依赖?

用 C 编写的代码示例:

short a = -5;

我需要在哪里查看以了解a二进制补码1111 1111 1111 1011还是有符号位表示1000 0000 0000 0101

4

5 回答 5

6

C 支持有符号整数的以下三种表示形式:

  • 2 的补码(最常见,在实践中你不太可能看到其他人)
  • 1 的补码
  • 符号和大小

C 还允许在表示中存在一些填充(非值)位,这在实践中也是非常不常见的。

C 没有定义整数是否应该以大端或小端或其他字节顺序存储在内存中。

如果您想了解整数在特定平台上的精确表示方式,则需要分析底层内存。此外,如果-INT_MAX == INT_MIN + 1,您有一个 2 的补码表示,否则不确定它是三个中的哪一个。

我认为现在可以安全地假设没有填充位并且表示是 2 的补码。

于 2013-02-26T11:25:21.807 回答
5

它依赖于平台,与小/大端相同。此外,某些类型的数量大小取决于平台。

于 2013-02-26T11:16:38.683 回答
4

整数的表示取决于平台(处理器)。请参阅字节顺序

于 2013-02-26T11:15:01.580 回答
3

整数的二进制表示取决于平台,如果平台遵循小端序,则整数然后 -ve no.s 存储为 2 的补码。

a= -5;
b = 5;
printf("%d %d", a, b);
printf("\n%u %u", a, b);

会显示,

-5 5
4294967291 5
于 2013-02-26T11:27:41.113 回答
2

有符号短 -5 是 0xFFFB。符号+绝对值表示没有意义。加法和减法不关心有符号/无符号类型。如果您添加 0xFFFB 和 0x0005,您将得到 0x0000。如果您尝试 0x8005 + 0x0005,您将得到 0x800A,这将根据您的假设 -10,这是无稽之谈。该数字是二进制补码,但它只是 -x = 2^16 - x (mod 2^16) 用于短数字。

于 2013-02-26T11:34:25.443 回答