如果有字段定义为int类型的话,那么符号位的判断需要特别注意。 例如:下面的 B::f2 字段是有符号类型,其符号位是f2的最高位,可以表示的范围是-64~63
1#include <iostream>
2
3struct B {
4 unsigned int f1:1;
5 int f2:7;
6};
7
8int main()
9{
10 B b1 = {0, 10};
11 B b2 = {0, 127};
12
13 std::cout << std::boolalpha << (b1.f2 >= 0) << std::endl; // true
14 std::cout << std::boolalpha << (b2.f2 >= 0) << std::endl; // false
15}
1#include <iostream>
2#include <cstring>
3using namespace std;
4
5struct Flags {
6 uint32_t k1 : 1;
7};
8
9struct AA {
10 // Flags flag : 1; // error: bit-field ‘flag’ with non-integral type ‘Flags’
11 Flags flag;
12 bool a1 : 1;
13 uint32_t a2 : 4;
14};
15
16int main()
17{
18 cout << sizeof (AA) << endl;
19
20 AA obj;
21 memset(&obj, 0, sizeof(AA));
22 obj.flag.k1 = 1;
23 obj.a1 = 1;
24 obj.a2 = 0b1111;
25
26 uint64_t val = *(uint64_t *)(&obj);
27 int len = sizeof(AA) * 8;
28 for (int i = 0; i < len; i++) {
29 cout << ((val >> (len - 1 - i)) & 0x01);
30 }
31}
32
33// output:
34// 8
35// 0000000000000000000000000001111100000000000000000000000000000001