位域用法
如果有字段定义为int类型的话,那么符号位的判断需要特别注意。
例如:下面的 B::f2 字段是有符号类型,其符号位是f2的最高位,可以表示的范围是-64~63
#include <iostream>
struct B {
unsigned int f1:1;
int f2:7;
};
int main()
{
B b1 = {0, 10};
B b2 = {0, 127};
std::cout << std::boolalpha << (b1.f2 >= 0) << std::endl; // true
std::cout << std::boolalpha << (b2.f2 >= 0) << std::endl; // false
}
#include <iostream>
#include <cstring>
using namespace std;
struct Flags {
uint32_t k1 : 1;
};
struct AA {
// Flags flag : 1; // error: bit-field ‘flag’ with non-integral type ‘Flags’
Flags flag;
bool a1 : 1;
uint32_t a2 : 4;
};
int main()
{
cout << sizeof (AA) << endl;
AA obj;
memset(&obj, 0, sizeof(AA));
obj.flag.k1 = 1;
obj.a1 = 1;
obj.a2 = 0b1111;
uint64_t val = *(uint64_t *)(&obj);
int len = sizeof(AA) * 8;
for (int i = 0; i < len; i++) {
cout << ((val >> (len - 1 - i)) & 0x01);
}
}
// output:
// 8
// 0000000000000000000000000001111100000000000000000000000000000001

浙公网安备 33010602011771号