R..*_*R.. 14 c integer padding width
以char字节为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type).一个常见的习惯用法是乘以CHAR_BIT找到该类型占用的位数,但是在使用填充位的实现中,这将不等于值位的宽度.更糟糕的是,代码如下:
x>>CHAR_BIT*sizeof(type)-1
Run Code Online (Sandbox Code Playgroud)
如果CHAR_BIT*sizeof(type)大于实际宽度,实际上可能有未定义的行为type.
为简单起见,我们假设我们的类型是无符号的.那么宽度type是ceil(log2((type)-1).有没有办法将此值计算为常量表达式?
Ano*_*Guy 10
有一个类似函数的宏可以确定整数类型的****值位****,但前提是你已经知道该类型的最大值.你是否会得到一个编译时常量取决于你的编译器,但我想在大多数情况下答案是肯定的.
感谢Hallvard B. Furuseth为他在回复comp.lang.c上的问题时发布的类似IMAX_BITS()函数的宏.
/* 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))
Run Code Online (Sandbox Code Playgroud)
IMAX_BITS(INT_MAX)计算int中的位数,IMAX_BITS((unsigned_type)-1)计算unsigned_type中的位数.直到有人实现4千兆字节的整数,无论如何:-)
而信贷埃里克Sosman此备用版本应该少于2040位工作:
(编辑2011年1月3日下午11:30 EST:原来,这个版本还写了Hallvard B. Furuseth)
/* Number of bits in inttype_MAX, or in any (1<<k)-1 where 0 <= k < 2040 */
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))
Run Code Online (Sandbox Code Playgroud)
请记住,虽然无符号整数类型的宽度等于值位数,但有符号整数类型的宽度更大(§6.2.6.2/ 6).这是特别重要的,因为在我对您的问题的原始评论中,我错误地声明IMAX_BITS()宏在实际计算值位数时计算宽度.对于那个很抱歉!
因此,例如,IMAX_BITS(INT64_MAX)将创建63的编译时常量.但是在此示例中,我们正在处理签名类型,因此如果您想要int64_t的实际宽度,则必须为符号位添加1,当然这是64 .
在另一个comp.lang.c讨论中,名为blargg的用户给出了宏如何工作的细分:
Re:使用预处理器来计算整数类型的位...
请注意,宏仅适用于2 ^ n-1个值(即二进制中的所有1),正如任何MAX值所预期的那样.还要注意,虽然很容易得到无符号整数类型(IMAX_BITS((unsigned type)-1))的最大值的编译时常量,但在撰写本文时,我不知道如何为没有符号的整数类型做同样的事情调用实现定义的行为.如果我发现我会回答我自己的相关SO问题,这里:
C问题:off_t(以及其他有符号整数类型)的最小值和最大值 - Stack Overflow
将宏与<limits.h>特定整数宽度的已知最大值进行比较:
#include <limits.h>
#if UINT_MAX == 0xFFFF
#define INT_WIDTH 16
#elif UINT_MAX == 0xFFFFFF
#define INT_WIDTH 24
#elif ...
#else
#error "unsupported integer width"
#endif
Run Code Online (Sandbox Code Playgroud)