C99 (ISO/IEC 9899:1999)
6.2.6.2/1 整数类型
填充位的值是未定义的。45) 对于有符号整数类型的有效(非trap)对象表示,其中符号位为零,则该对象表示的无符号类型的相应对象表示是有效的,并且应该表示相同的值。
对于任何整数类型,所有位都为零的对象表示应该是该类型中值为零的一个表示形式。
在C99标准中,一个整数类型的所有位都为零的对象表示形式被保证表示相应类型的值为0
。但是,这是否保证底层二进制值与我们期望的相同呢?
例如:
unsigned x = 42;
通常情况下,计算机会将十进制的值 42
以二进制 101010
的形式存储在内存中。
然而,一些古怪的机器架构可能会将同样的十进制值 42
存储为二进制 011011
的形式(不一定是出于实际原因,只是因为它可以这样做)。
如果是这样的话,考虑以下使用右移操作的代码:
unsigned y = x>>1; /* 101010>>1 or 011011>>1 */
y
会持有十进制值21
(二进制为10101
),还是十进制值13
(二进制为01101
)?
C99标准是否保证无符号整数类型在位运算后的十进制表示--例如,所有机器结构上都保证右移相当于整数除以2
?
42 >> 1 == 21
吗? - Vilhelm Gray