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

我正在使用一个只有2KB SRAM的微控制器,并且迫切需要保存一些内存。 试图找出如何使用位域将8 0值放入单个字节中,但无法完成。

 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 } 

是什么赋予了?

所有的位域成员都是有符号的1位整数。 在二进制补码系统上,这意味着它们只能表示0-1 。 如果你想要01使用uint8_t

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

作为一个谨慎的话 – 标准并没有真正实施位域的实现scheme。 不能保证Bits将是1个字节,并且假设它完全有可能变得更大。

然而在实际中,实际的实现通常遵循明显的逻辑,“几乎总是”是1个字节的大小,但是不需要保证。 以防万一你想确定,你可以手动做 。

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

如上所述,这些variables只包含一个符号位,所以唯一可用的值是0-1

这些位域更合适的types是bool 。 C ++ 14§9.6/ 4:

如果值truefalse被存储到任何大小的booltypes(包括一个比特的比特字段)的比特字段中,则原始的bool值和比特字段的值应该相等。

是的, std::uint8_t可以完成这项工作,但是你最好使用它。 你不需要像std::cout << (int)b.b0;

有符号和无符号整数是答案。

请记住,信号只是位的解释,-1或1只是解释“variablestypes”的“打印”序列化程序,因为它被编译器“显示”给cout函数(看运算符重载),位是同样,它的价值也(开/关) – 因为你只有1位。

不关心这个,但是明确的做法是一个好习惯,所以更愿意用unsigned声明你的variables,它指示编译器在设置或者获取像“print”这样的序列化程序的值时挂载一个合适的代码(cout )。

“COUT”运算符超载: “cout”通过参数重载指示编译器调用哪个函数的一系列函数来工作。 所以,有两个函数,一个接收一个无符号的和另一个有符号的,因此他们可以解释相同的数据,你可以改变它,指示编译器调用另一个使用强制转换。 见cout << myclass