如何计算有符号位字段的最大支持值?

Ric*_*sen 3 c c99 bit-fields c11

假设我的项目包含来自第三方库的标题,其中包含:

struct foo {
    signed int x:4;
};
Run Code Online (Sandbox Code Playgroud)

如果不假设位字段总是具有宽度4,并且不依赖于实现定义的行为,那么如何确定可以存储在成员中的最大值x?

Dav*_*eri 5

由于无法计算位域的大小sizeof,这可以帮助:

#include <stdio.h>

struct foo {
    signed int x: 4;
};

#define BIT(n) (1l << (n))
#define BIT_MASK(len) (BIT(len) - 1)

int main(void)
{
    struct foo f = {0};
    long i = 0;

    while (f.x >= 0) {
        f.x = BIT_MASK(++i);
    }
    printf("bits=%ld max=%ld\n", i, BIT_MASK(i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

左移直到f.x负.

编辑:

上面的代码是实现定义的,检查一下,我认为这样可行(但你必须处理BIG ENDIAN):

#include <stdio.h>
#include <string.h>

struct foo {
    signed int x: 4;
};

#define BIT(n) (1l << (n))
#define BIT_MASK(len) (BIT(len) - 1)

int main(void)
{
    long x, i = 0;
    struct foo f;

    f.x = -1;
    memcpy(&x, &f, sizeof(f));
    while (1) {
        if (!(x & BIT(++i))) break; 
    }
    printf("bits=%ld max=%ld\n", i, BIT_MASK(i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你现在所看到的,它不超过2 ^(n-1)-1(适用于a long)

  • 这是非常好的答案!David RF你应该添加一些评论和解释. (2认同)