标准C++中是否有固定宽度的布尔类型?

6
据我所知,bool类型的宽度是由实现定义的。但是否有固定宽度的布尔类型,或者我应该使用uint8_t来代表固定宽度的布尔类型?
【编辑】 我编写了这个Python脚本,可以自动生成一个C++类,用于在微控制器和我的计算机之间传输变量。它的工作原理是保持两个数组,分别存储每个变量的指针和大小。这为我提供了必要的信息,以便轻松地对每个变量进行序列化和反序列化。然而,为了使其正常工作,变量类型的sizeof、字节顺序等必须在两端相同,因为我在两端都使用相同的生成代码。 我不知道这是否会成为问题,但我不认为会有问题。我之前已经使用过这个(32位ARM)芯片,在过去发送整数和浮点类型时没有遇到问题。不过,我需要几天时间才能回来并尝试在芯片上使用布尔类型。这可能会成为以后的一个更大问题,因为这段代码可能会在其他芯片上重复使用。
所以我的问题是,标准库中是否定义了固定宽度的bool类型,或者我应该只使用uint8_t来表示布尔值?

2
一个bool类型是固定的truefalse。但是这两种状态怎么可能有不同的宽度呢? - Thomas Matthews
1
你是指内存中的大小吗?如果是这样,对于bool类型它取决于编译器。在99.9%的情况下,它占用1位,因为它表示true或false,开或关。但是,其他7个位被填充,不能使用。这回答了你的问题吗? - Emz
1
@Emz:通常情况下,bool 是8位,除了最低位被设置为0之外,其他位都被设置为0。 - Keith Thompson
2
如果您能解释为什么需要某个特定宽度的布尔类型,那将会很有帮助。这样的类型有什么作用是bool不能满足的呢?(“拥有固定宽度”不是一个答案。) - Keith Thompson
1
在C和C++中,任何类型的sizeof大小在不同的架构下不一定相同。 - phuclv
显示剩余13条评论
1个回答

4

这并没有。如果你需要确保大小,只需使用uint8_t。在与C相关的语言中,任何整数类型都可以轻松地被处理为布尔值。有关bool大小不保证具有任何特定值的详细讨论,请参见https://dev59.com/eG445IYBdhLWcg3wXZIy#4897859


4
当进行这种操作时,显然没有对 bool 类型的隐式转换,因此您需要小心处理。例如,uint8_t x = 0x500 & 0x100; 的结果是 0,但一个布尔值将会是 true - M.M
@M.M 是的,但这很容易修复:uint8_t x = 0x500&0x100!= 0。你只需要小心一点。 - Mark Ransom
2
@MarkRansom ITYM (0x500&0x100)!= 0 ;) - M.M
一个更好的解决方案可能是使用静态断言来检查bool的大小。正如上面的评论和这个答案所示,使用uint8_t而不是bool会带来微妙错误的风险。 - nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接