【发布时间】:2011-04-26 19:33:13
【问题描述】:
以char/bytes 为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type)。一个常见的习惯用法是乘以 CHAR_BIT 以找到该类型占用的位数,但在使用填充位的实现中,这将不等于值位中的 width。更糟糕的是,代码如下:
x>>CHAR_BIT*sizeof(type)-1
如果CHAR_BIT*sizeof(type) 大于type 的实际宽度,则实际上可能具有未定义的行为。
为简单起见,我们假设我们的类型是无符号的。那么type的宽度就是ceil(log2((type)-1)。有没有办法将此值计算为常量表达式?
【问题讨论】:
-
是否有有填充位的实现?
-
@sbi:如果任何类型都允许填充位,那么实际上是否存在这样的实现并不重要。如果你想写portable和conforming代码,那你别无选择。当然,您可以为自己重新定义“便携”为“到任何没有填充位的系统”。只需将其记录好,以便在它突然不再起作用时记住它。
-
@sbi:每个 C99 实现都有一个带有填充位的类型,即
_Bool。它的最大值是1,它的大小也至少是1。所以它有CHAR_BIT - 1填充位。 -
@sbi:整数类型的宽度是标准中定义明确的术语。它与它的大小(即它的存储要求)有明显的区别。
-
如果您查看 my question that you commented on 2010 年 12 月 29 日的编辑,我发现一个类似函数的宏在 comp.lang.c 中搜索,它应该为宽度创建一个编译时常量(定义作为值位和符号位(如果适用)。如前所述,您必须知道类型的 MAX 才能使用宏。我希望这是有帮助的。我也回复了你在a different question I had about padding bits 上的评论。我想知道您是否不同意我的想法,如果可以,您可以在那里回复。谢谢