c89 标准要求实现提供哪些硬件特定定义?
What hardware specific defines does the c89 standard require the implementation to provide?
c(89) 标准是否指定了必须由实现定义的某些硬件属性?例如,在我的 Linux 系统上有一个 __WORDSIZE
的定义(定义为 64)——我可以期望 __WORDSIZE
在每个符合 c(89) 的系统上定义吗? c 标准是否需要实现提供其他硬件特定值?
我想到 CHAR_BIT
(请参阅 C11 标准草案的 5.2.4.2.1/1)。
它定义了非位域的最小整数的宽度(位数)。在最近的系统上,这通常是 8。
不过,这是否一定要被视为硬件属性还有待商榷。
C 试图抽象硬件属性。这可能是它传播的(主要?)原因。
C89 指定由 limits.h
、see here for the freely accessible draft text.
提供的限制
正如 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
只需要能够容纳一个指针——它 可以 更大。
c(89) 标准是否指定了必须由实现定义的某些硬件属性?例如,在我的 Linux 系统上有一个 __WORDSIZE
的定义(定义为 64)——我可以期望 __WORDSIZE
在每个符合 c(89) 的系统上定义吗? c 标准是否需要实现提供其他硬件特定值?
CHAR_BIT
(请参阅 C11 标准草案的 5.2.4.2.1/1)。
它定义了非位域的最小整数的宽度(位数)。在最近的系统上,这通常是 8。
不过,这是否一定要被视为硬件属性还有待商榷。
C 试图抽象硬件属性。这可能是它传播的(主要?)原因。
C89 指定由 limits.h
、see here for the freely accessible draft text.
正如 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
只需要能够容纳一个指针——它 可以 更大。