c(89)标准是否指定了必须由实现定义的某些硬件属性?例如,在我的Linux系统上有__WORDSIZE
的定义(定义为64) - 我是否可以期望在符合c(89)的每个系统上定义__WORDSIZE
?是否存在c标准要求实现提供的其他硬件特定值?
答案 0 :(得分:4)
CHAR_BIT
出现在我的脑海中(见C11标准草案的5.2.4.2.1 / 1)。
它定义不是位字段的最小整数的宽度(位数)。在最近的系统中,这通常是8。
但是,这是否必须被视为硬件属性是有争议的。
C尝试抽象硬件属性。这可能是它传播的主要原因。
答案 1 :(得分:4)
C89指定limits.h
,see here for the freely accessible draft text提供的限制。
由alk answered by alk评论已经,唯一一个真正硬件特定的是CHAR_BIT
,其他的是实现具体
对于__WORDSIZE
,这不是标准定义,而且字数应该是什么值得怀疑。
你总是可以使用一个巧妙的宏来确定一个类型中的位数,例如in this answer,在这里引用它:
/* Number of bits in inttype_MAX, or in any (1<<b)-1 where 0 <= b < 3E+10 */
#define IMAX_BITS(m) ((m) /((m)%0x3fffffffL+1) /0x3fffffffL %0x3fffffffL *30 \
+ (m)%0x3fffffffL /((m)%31+1)/31%31*5 + 4-12/((m)%31+3))
有了这个,您可以像这样确定unsigned int
的位大小:
IMAX_BITS((unsigned)-1)
但这真的是字号吗?在x86_64上,结果为32,而指针为64位。
使用 C99 以及之后,您可以使用
IMAX_BITS((uintptr_t)-1)
但要注意uintptr_t
只需要能够持有一个指针 - 可以更大。