2013-02-26 75 views
3

C是否定义整数的二进制表示形式,例如one's,two's complement ...或者这是 表示处理器(计算机或其他)的依赖关系吗?计算机中的整数表示 - C

的Exmple C语言编写的代码:

short a = -5; 

在哪里,我需要看就知道wheter a是补1111 1111 1111 1011或 签位表示1000 0000 0000 0101

+0

不依赖于处理器,该表示与语言实现相关。 – sgarizvi 2013-02-26 11:15:22

+4

99.9999%这是两个补码。您可以使用格式将值显示为十六进制(使用printf或sprintf使用%X)。 – m0skit0 2013-02-26 11:17:41

回答

6

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

  • 2的补数(最常见的,你是相当不可能看到在实践等)
  • 1的补
  • 标志 - 和 - 量级

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

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

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

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

+0

我会对此进行投票,但如果根据6.5p5,“INT_MAX == 32768”和“INT_MIN == -32767”,则“-INT_MAX”可能是未定义的行为。 – Sebivor 2013-02-26 11:30:03

+0

@modifiablelvalue那('INT_MAX = 32768')没有什么意义(尽管如此,'INT_MIN = -32767'确实可以)。 – 2013-02-26 11:33:26

+0

也许更好的测试是:'unsigned int x = INT_MIN; x + = INT_MAX;如果(x!= 0){/ *二进制补码* /}' – Sebivor 2013-02-26 11:37:57

4

整数的表示是平台(处理器)相关的。请参阅Endianness

5

它依赖于平台,与little/big Endian相同。 某些类型的号码大小也取决于平台。

3

整数的二进制表示是平台相关的,如果平台遵循little endian,则整数然后-ve no被存储为2的补码。

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

将显示,

-5 5 
4294967291 5 
2

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

+0

'签名的短-5是0xFFFB',这是不是由C标准保证。 – 2013-02-26 11:37:14

+0

标准确实没有提到二进制表示。这意味着,对主要问题的回答是“否”,但除了通常的数字表示将是完全愚蠢的。请给出一些这样(或其他)愚蠢的数字表示的例子。 – 2013-02-26 11:51:25

+0

[Wikipedia](http://en.wikipedia.org/wiki/Signed_number_representations) – 2013-02-26 11:52:57