在1字节内存储8个逻辑真/假值?

Jaz*_*ash 64 c++ bit-fields

我正在研发一个只有2KB SRAM的微控制器,并且迫切需要节省一些内存.试图找出如何使用位域将8 0/ 1值放入单个字节但不能完全解决的问题.

struct Bits
{
    int8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};

int main(){
    Bits b;
    b.b0 = 0;
    b.b1 = 1;

    cout << (int)b.b0; // outputs 0, correct
    cout << (int)b.b1; // outputs -1, should be outputting 1
}
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

Car*_*rum 112

所有的bitfield成员都是带符号的1位整数.在二元补语系统中,这意味着它们只能代表0或者-1.使用uint8_t,如果你想01:

struct Bits
{
    uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
Run Code Online (Sandbox Code Playgroud)

  • @chux如果可表示的值是*not*0和-1,则它不是2s补码表示.(在1的补数的假设情况或符号 - 量值表示,所述表示的值将是0和-0,或者可能0和陷阱表示].我不知道任何**符号整数格式的其中1位字段表示值0和1.) (9认同)
  • @zwol同意:C指定'符号位具有值 - (2 ^ M)(二进制补码);"§6.2.6.22.因此,它指定它必须是'0`或`-1`. (4认同)

dte*_*ech 13

需要注意的是 - 标准并没有真正强制实施位域的实现方案.不能保证Bits1个字节,假设它完全可能更大.

然而,在实践中,实际的实现通常遵循明显的逻辑,并且"几乎总是"大小为1字节,但同样,并不要求保证它.万一你想确定,你可以手动完成.

BTW -1仍然是true-1 != true