gpt4 book ai didi

c - 有没有办法在编译时计算整数类型的宽度?

转载 作者:太空狗 更新时间:2023-10-29 16:35:53 25 4
gpt4 key购买 nike

char/bytes 为单位的整数类型(或任何类型)的大小很容易计算为 sizeof(type)。一个常见的习惯用法是乘以 CHAR_BIT 以找到类型占用的位数,但在具有填充位的实现中,这将不等于值中的宽度位。更糟糕的是,代码如下:

x>>CHAR_BIT*sizeof(type)-1

如果 CHAR_BIT*sizeof(type) 大于 type 的实际宽度,则实际上可能有未定义的行为。

为简单起见,我们假设我们的类型是无符号的。那么type的宽度就是ceil(log2((type)-1)。有什么方法可以把这个值计算成常量表达式吗?

最佳答案

有一个类似于函数的宏可以确定整数类型的值位,但前提是您已经知道该类型的最大值。您是否会获得编译时常量取决于您的编译器,但我猜大多数情况下答案是肯定的。

归功于 Hallvard B. Furuseth 在回复 question on 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))

IMAX_BITS(INT_MAX) computes the number of bits in an int, and IMAX_BITS((unsigned_type)-1) computes the number of bits in an unsigned_type. Until someone implements 4-gigabyte integers, anyway:-)


并且 感谢 Eric Sosman 这个 [替代版本](http://groups.google.com/group/comp.lang.c/msg/e998153ef07ff04b?dmode=source) 应该可以用 less超过 2040 位:**(编辑 1/3/2011 11:30PM 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))

**请记住,虽然无符号整数类型的宽度等于值位数,但有符号整数类型的宽度要大一位 (§6.2.6.2/6)。**这在我的文章中特别重要对你的问题的原始评论我错误地指出 IMAX_BITS() 宏在实际计算值位数时计算宽度。对于那个很抱歉!

因此,例如 IMAX_BITS(INT64_MAX) 将创建一个编译时常量 63。但是,在此示例中,我们处理的是有符号类型,因此您必须加 1 以说明符号如果你想要一个 int64_t 的实际宽度,这当然是 64。

在单独的 comp.lang.c 讨论中,名为 blargg 的用户详细介绍了宏的工作原理:
Re: using pre-processor to count bits in integer types...

请注意,宏仅适用于 2^n-1 个值(即二进制中的所有 1),正如预期的任何 MAX 值一样。另请注意,虽然很容易获得无符号整数类型 (IMAX_BITS((unsigned type)-1)) 的最大值的编译时常量,但在撰写本文时,我并不'知道有什么方法可以在不调用实现定义的行为的情况下对有符号整数类型做同样的事情。如果我发现我会在这里回答我自己的相关 SO 问题:
C question: off_t (and other signed integer types) minimum and maximum values - Stack Overflow

关于c - 有没有办法在编译时计算整数类型的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3957252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com