Ric*_*sen 3 c c99 bit-fields c11
假设我的项目包含来自第三方库的标题,其中包含:
struct foo {
signed int x:4;
};
Run Code Online (Sandbox Code Playgroud)
如果不假设位字段总是具有宽度4,并且不依赖于实现定义的行为,那么如何确定可以存储在成员中的最大值x?
由于无法计算位域的大小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)