【问题标题】:What is the type of uint8_t multiplied by boolean value?uint8_t 乘以布尔值的类型是什么?
【发布时间】:2023-04-11 11:27:01
【问题描述】:

standard,我试图了解表达式最终会是哪种类型:

bool myBool;
[...]
uint8_t(255) * (myBool);

我是否保证myBool 将被转换为uint8_t(又名unsigned char),或者整个结果可能是int

有用的链接:bool to int conversion

【问题讨论】:

  • 一般来说,这是没有意义的。将一个数字乘以 truefalse 没有意义。就像将数字 42 乘以橙色一样。我建议重新编写一些有意义的东西。让编译器对其进行优化。
  • @ThomasMatthews 我倾向于不同意您的评论:行为在标准中得到了很好的定义。
  • 那么一个数字错误相加的语义是什么?请记住,乘法是重复的加法。因此,您将 false 添加到数字中。同样,truefalse 是布尔或逻辑属性,而不是数学属性。它们可以映射到 4 和 5 或“frog”和“rover”,但仍然没有意义。这是一个hack
  • @ThomasMatthews 我不明白你的说法:标准也定义了真假映射...

标签: c++ boolean


【解决方案1】:

两个操作数都将提升为int,这将是结果类型。

一般来说,整数操作数至少会被提升为int,或者必要时更大的类型,并且不会对更小的类型执行算术运算。这在 C++11 4.5 (Integral Promotions) 中有描述。

对于uint8_t

1/除boolchar16_tchar32_twchar_t以外的整数类型的纯右值,其整数转换秩小于int的秩可以转换为类型的纯右值int 如果int 可以表示源类型的所有值;否则,可以将源纯右值转换为unsigned int 类型的纯右值。

如果存在,则所有 8 位 uint8_t 值都可以由 int 表示(必须至少为 16 位),因此 int 是提升的类型。

对于bool

6/ bool 类型的纯右值可以转换为 int 类型的纯右值,false 变为 0,true 变为 1。

所以也提升为int,给出int的整体结果类型。

【讨论】:

  • 如果我做 uint8_t(255) * uint8_t(myBool)?
  • @Antonio: uint8_t 将被提升为int
【解决方案2】:

来自您链接到的文档:

5 种表达方式

9 许多需要算术或枚举操作数的二元运算符 类型导致转换和产生结果类型以类似的方式。 目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:

...

--否则,将执行积分促销(conv.prom) 在两个操作数上。1)

4.5 整体促销

1 char、signed char、unsigned char、short int 或 unsigned short int 可以转换为 int 类型的右值 if int 可以表示源类型的所有值;否则,源 右值可以转换为 unsigned int 类型的右值

...

4 bool 类型的右值可以转换为 int 类型的右值,使用 假变零,真变一。

在您的情况下,LHS 和 RHS 都将在算术运算之前提升为 int,结果将是 int 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2016-04-03
    • 2010-09-13
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多