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