繁体   English   中英

如何在c中声明与int的位大小相对应的数组?

[英]How to declare array that correspond to bit size of the int in c?

基本上我需要这样的东西:

#if (sizeof(int) * CHAR_BIT) == 32
INT_MASKS[32] = {
    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
    ...
};
#elif (sizeof(int) * CHAR_BIT) == 64
INT_MASKS[64] = {
    0x0000000100000001, 0x0000000300000003, 0x0000000700000007, 0x0000000F0000000F,
    0x0000001F0000001F, 0x0000003F0000003F, 0x0000007F0000007F, 0x000000FF000000FF,
    ...
};
#else
    #error unsupported architecture
#endif;

每个#if #else分支中只有一个以上的数组,因此等效的工作将节省很多空间。 另外,一些数组包含表达式的负载,我想在编译过程中对其求值。 感谢您的答复。

gcc 等人定义__INT_MAX__您可以将其用于gcc和与gcc兼容的编译器,然后可以为需要支持的任何其他编译器明确定义它:

#if __INT_MAX__ == 0x7fffffff
INT_MASKS[32] = {
    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
    ...
};
#elif __INT_MAX__ == 0x7fffffffffffffff
INT_MASKS[64] = {
    0x0000000100000001, 0x0000000300000003, 0x0000000700000007, 0x0000000F0000000F,
    0x0000001F0000001F, 0x0000003F0000003F, 0x0000007F0000007F, 0x000000FF000000FF,
    ...
};
#else
    #error unsupported architecture
#endif

怎么样呢?:

#include <limits.h>

#if UINT_MAX == 0xFFFFFFFF
INT_MASKS[32] = {
    0x00000001, 0x00000003, 0x00000007, 0x0000000F,
    0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
    ...
};
#elif UINT_MAX == 0xFFFFFFFFFFFFFFFF
INT_MASKS[64] = {
    0x0000000100000001, 0x0000000300000003, 0x0000000700000007, 0x0000000F0000000F,
    0x0000001F0000001F, 0x0000003F0000003F, 0x0000007F0000007F, 0x000000FF000000FF,
    ...
};
#else
#error unsupported architecture
#endif

通常这样做的方法是编写一个单独的程序来生成声明,从而避免乏味地键入所有这些常量表达式。 例如,可以通过以下代码摘录生成INT_MASKS声明:

int i, intbits = sizeof(int) * CHAR_BIT;
if (intbits == 32) {
    printf("unsigned INT_MASKS[%d] = {\n", intbits);
    for (i = 0; i < intbits; i++) {
        unsigned mask = (unsigned)(~0) >> (intbits - i - 1);
        printf("    0x%08x,\n", mask, mask);
    }
    printf("};\n", intbits);
} else if (intbits == 64) {
    int half = intbits / 2;
    printf("unsigned INT_MASKS[%d] = {\n", intbits);
    for (i = 0; i < intbits; i++) {
        unsigned mask = (unsigned)(~0) >> (half - (i%half) - 1);
        printf("    0x%08x%08x,\n", mask, mask);
    }
    printf("};\n", intbits);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM