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