gpt4 book ai didi

c++ - 如何将位域成员的所有位设置为 1

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:56 25 4
gpt4 key购买 nike

这个问题很简单。鉴于

struct Foo{
bool : 1;
bool : 1;
int bar : sizeof(int) * 8 - 2;
};

如何在没有警告的情况下将 bar 的所有位设置为 1?

显然我可以做 auto v = Foo(); v.bar = ~0; 但是 GCC 给了我这个:

warning: large integer implicitly truncated to unsigned type [-Woverflow]

我已经尝试了几种方法,但它总是呈现警告...

最佳答案

不要使用 ~0(它总是一个完整的 int),而是使用 ~v.bar,它是正确的大小并且可以像这样组合:

v.bar |= ~v.bar; // or,
v.bar ^= ~v.bar;

应该可以解决任何尺寸的问题。

不幸的是,你不能很好地将它包装在一个函数中,因为你不能将引用绑定(bind)到位域。您要么需要将其作为 Foo& 的函数,要么使用宏。

附言。在使用 coliru 发布之前,我很快尝试了这个,并使用 GCC (g++) 5.3.1 和 6.2.0 在本地重新检查 - 都没有使用 -Wall 发出任何诊断。

PPS.

使用此测试代码,GCC 仅为未签名的成员生成诊断:

struct Foo {
int i : 2;
unsigned int u : 30;
};

void bar() {
Foo f {0, 0};
f.i ^= ~f.i; // OK
f.u |= ~f.u; /* warning:
large integer implicitly truncated to unsigned type [-Woverflow]
*/
}

因此,虽然我通常也更喜欢将无符号整数用于位域或按位操作,但 g++ 在这里使用 int 更快乐、更安静。

关于c++ - 如何将位域成员的所有位设置为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42202123/

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