[位域 - cppreference.com](https://zh.cppreference.com/w/cpp/language/bit_field) `bool`使用一个字节的大小也就是8位, 但实际上它只需要表示`0`或者`1`,逻辑上来说只需要1位,在不能容忍浪费的场合浪费七分之一简直是犯罪 位域就可以让我们强制使用指定数量的二进制位 ```cpp struct Bool{ bool value : 1; }; ``` 这样我们就有了一个只占用一个字节的`bool`变量 如果我们另外有一个占7位的字段,那就共同占了一个字节 ```cpp struct Bool{ bool value : 1; unsigned int field : 7; }; ``` 可以很自然地去使用,但是位域无法取地址,就很难知道内存中是怎么存储地,可以用取巧的方法达成目的 ```cpp #include <iostream> #include <bitset> union Bool { struct { bool value: 1; unsigned char field: 7; }; unsigned char data; }; int main() { Bool b{}; b.value = true; b.field = 0b1000001; std::cout << std::bitset<8>(b.data) << std::endl; b.value = false; b.field = 0b0100010; std::cout << std::bitset<8>(b.data) << std::endl; return 0; } ``` ```text 10000011 01000100 ``` 番外:有个群友提出一个貌似无厘头的问题,那就是一位的有符号数是多少,也就是 ```cpp struct{ signed int value : 1; }bitfield; ``` 有符号数第一位是符号位,那就没有代表值的位了,根据数据类型的知识$n$位有符号数的取值范围是 $ -2^{n-1} \sim 2^{n-1}-1 $ 那么一位的时候呢当$n = 1$时 $ -2^{1-1} \sim 2^{1-1}-1 = -1 \sim 0 $ 根据补码原则,显然当$value = 1$时$value = -1$