位域用法

如果有字段定义为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
posted @ 2023-07-13 16:51  devin1024  阅读(26)  评论(0)    收藏  举报