在编译时,是否可以在不使用CHAR_BIT的情况下确定CHAR_BIT的值?需要包含 吗?

编程语言 2026-07-11

为了让使用Clang进行跨编译的C 代码能够使用 CHAR_BIT,需要包含 <limits.h>。要包含 <limits.h>,需要同时指定 --sysroot-isystem 这两个选项。出于某些原因,似乎并不想指定这些选项。

当前人们使用 __CHAR_BIT__ 代替 CHAR_BIT。然而,是否存在某种技巧,可以在翻译阶段(可靠地)确定 CHAR_BIT 的值,而不使用 CHAR_BIT?例如,使用一系列(算术)运算。

解决方案

此答案 为我们提供了这个宏:

/* 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 char 值,该值通过 (unsigned char) -1 获得,以得到位数,前提是它小于32,000,000,000位:

#include <stdio.h>


int main(void)
{
    #define IMAX_BITS(m) ((m) /((m)%0x3fffffffL+1) /0x3fffffffL %0x3fffffffL *30 \
                  + (m)%0x3fffffffL /((m)%31+1)/31%31*5 + 4-12/((m)%31+3))

    printf("%ld\n", IMAX_BITS((unsigned char) -1));
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章