C是否定义整数的二进制表示形式,例如 一个,两个的补码...或者是这个
表示处理器(计算机或其他)依赖吗?
用C语言编写的示例代码:
short a = -5;
我需要在哪里知道a是二进制补码1111 1111 1111 1011还是
带符号的位表示形式1000 0000 0000 0101?
与处理器无关,表示与语言实现有关。
二进制补码的99.9999%。 您可以使用格式将值显示为十六进制(将%X与printf或sprintf一起使用)。
C支持带符号整数的以下三种表示形式:
2的补码(最常见的情况是,您不太可能在实践中看到其他人)
1的补码
符号和大小
C还允许表示中有一些填充(非值)位,这在实践中也很少见。
C没有定义整数应按大端或小端还是其他字节顺序存储在内存中。
如果要查找特定平台上整数的精确表示方式,则需要分析基础内存。另外,如果-INT_MAX == INT_MIN + 1,则您具有2的补码表示形式,否则不确定,它是三个中的哪一个。
我认为可以安全地假设这些天没有填充位,并且表示形式是2的补码。
我对此表示赞成,但例如,根据6.5p5,如果INT_MAX == 32768和INT_MIN == -32767,则-INT_MAX可能是未定义的行为。
@modifiablelvalue(INT_MAX = 32768)毫无意义(尽管INT_MIN = -32767可以)。
也许更好的测试是:unsigned int x = INT_MIN; x += INT_MAX; if (x != 0) { * Twos complement * }
@modifiablelvalue应该可以,是的。
@modifiablelvalue实际上,该标准说,在带符号的非负整数中,所有值位都具有与随附的无符号整数相同的值。它还保证无符号整数可以表示2^(number of value bits) - 1(含)以下的值。因此,INT_MAX必须为2^(some integer) - 1,而不能为2^(some integer)。
这如何使INT_MAX(如32768)不具备将基础二进制表示形式为10000000 00000000作为有符号和无符号整数的资格?
您的结论似乎无效。
@modifiablelvalue我不是在谈论32768的二进制形式。我说32768不能是INT_MAX的值。但是32767可以。
仔细阅读6.2.6.2之后,您似乎很正确。在这样的时候,我希望自己能更谦虚一些。
@modifiablelvalue我也犯了错误。是人类,所以它不可避免。 :)
它与平台有关,与大端字节序相同。
某些类型的数字大小也取决于平台。
整数的表示形式取决于平台(处理器)。请参阅字节序。
整数的二进制表示形式取决于平台,如果平台遵循小尾数,则整数将-ve no.s存储为2的补码。
a= -5;
b = 5;
printf("%d %d", a, b);
printf("
%u %u", a, b);
将显示,
-5 5
4294967291 5
有符号短-5为0xFFFB。符号+绝对值表示没有任何意义。
加法和减法不关心有符号/无符号类型。如果将0xFFFB和0x0005相加,将得到0x0000。如果您尝试使用0x8005 + 0x0005,您将得到0x800A,这将基于您的假设-10(这是胡说八道)。该数字是二进制补码,但是对于短数字,它只是-x = 2 ^ 16-x(mod 2 ^ 16)。
C标准不能保证的signed short -5 is 0xFFFB。
标准确实没有讲二进制表示。这意味着,对主要问题的回答是"否",但与通常不同的数字表示将完全是愚蠢的。请提供此类(或其他)愚蠢数字表示形式的示例。
底数减去二? ;) 开玩笑。
问题不是数字如何存储,而是数字如何表示。例如。我不关心int64的字节序,如果我想通过检查最后一位知道数字是偶数还是奇数。您不必关心它在内存中是最后还是第一个或中间,或者数字表示形式周围或内部是否有填充。
如果要知道其偶数还是奇数,请将数字强制转换为任何无符号类型,然后直接执行& 1或直接执行% 2而不进行强制转换。
那就是我所说的。