【问题标题】:What hardware specific defines does the c89 standard require the implementation to provide?c89 标准要求实现提供哪些硬件特定定义?
【发布时间】:2017-07-10 10:42:08
【问题描述】:

c(89) 标准是否指定了必须由实现定义的某些硬件属性?例如,在我的 Linux 系统上,有一个 __WORDSIZE 的定义(定义为 64) - 我可以期望在每个符合 c(89) 的系统上定义 __WORDSIZE 吗? c标准是否需要实现来提供其他特定于硬件的值?

【问题讨论】:

  • “c(89) 标准是否指定了必须由实现定义的某些硬件属性?”
  • 虽然标准本身要花钱,但您可以轻松找到可在线免费阅读的草稿。批准前的最后草案通常与当时的标准相同。
  • 完整列表在您引用的标准中标明,因此您可以安全假设出现的唯一标识符是出现在文档中的标识符。

标签: c standards c89


【解决方案1】:

C89 指定由limits.hsee here for the freely accessible draft text 提供的限制。

正如alkanswered 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 只需要能够容纳一个指针——它可以更大。

【讨论】:

  • " (1
  • @chux 不,它确实适用于(假设的)像这样的大量数字。请参阅原始答案以及指向一些 usenet 发布的链接以获取解释。
  • 是的,我现在看到了。
【解决方案2】:

CHAR_BIT 出现在我的脑海中(参见 C11 标准草案的 5.2.4.2.1/1)。

它定义了不是位域的最小整数的宽度(位数)。在最近的系统上,这通常是 8。

不过,这是否必须被视为硬件属性是有争议的。

C 尝试抽象硬件属性。这可能是它传播的一个(主要原因?)原因。

【讨论】:

  • 或者在C89 standard draft下2.2.4.2的数值限制。 __WORDSIZE 是内部编译器,如此处所述:stackoverflow.com/a/30734004/8051589
  • uv'ing,仍然是一个问题:CHAR_BIT 与硬件属性 相关的论点是什么?
  • @FelixPalmen:我可以想象一个 9 位硬件上的 C 实现,每个“字节”仅使用 8 位。在 8.5 位硬件上可能有意义(每个偶数字节为 8 位,每个奇数字节为 9 位)... ;-)
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2011-07-19
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多