如果 uint8_t 值乘以 uint8_t 是啥类型 [重复]

Posted

技术标签:

【中文标题】如果 uint8_t 值乘以 uint8_t 是啥类型 [重复]【英文标题】:What is type if uint8_t value multiplied by uint8_t [duplicate]如果 uint8_t 值乘以 uint8_t 是什么类型 [重复] 【发布时间】:2019-08-30 09:43:03 【问题描述】:

如果uint8_t 值乘以uint8_t 是什么类型?例如:

#include <iostream>

int main()

    uint8_t a = 'a', b = 'b';
    std::cout << a * b;

程序的输出是9506a * b 会是 uint32_t 类型数据吗? 为什么不仍然是 uint8_t 类型? 谢谢。

【问题讨论】:

C++ 程序计算表达式的最小整数类型是int。任何较小的类型sizeof(uint_8) &lt; sizeof(int) 将导致值在操作之前被提升。操作的结果始终与输入值的类型相同(在这种情况下是在提升之后)。请参阅:***.com/a/5563131/14065 最后一种情况适用于Both operands are promoted to int 顺便说一下,两个 8 位值相乘的结果将适合 16 位。 【参考方案1】:

由于 C++ 整数类型中的integer promotion 规则比通常算术运算中的int 窄,在应用运算之前会提升为int(简化解释)。

你可以在https://cppinsights.io/ 观察这个(整洁的工具对吧?):

#include <cstdint>

int main()

    uint8_t a = 'a', b = 'b';
    [[mayebe_unsued]] auto r = a * b; // <-- pay attention here

由编译器在内部转换为:

#include <cstdint>

int main()

  uint8_t a = static_cast<unsigned char>('a');
  uint8_t b = static_cast<unsigned char>('b');
  int r = static_cast<int>(a) * static_cast<int>(b); // <-- pay attention here

至于为什么,使用平台本机类型 (int) 的操作数比使用更窄类型的操作数更快被认为是一种倒退。老实说,我不知道这在现代建筑中有多少真实性。

【讨论】:

注意:记住as if 规则。如果将该值分配回 unint8_t 并且 uint8_t 的乘法比 int 快,则编译器可以使用它,因为可观察到的结果将是相同的。【参考方案2】:

发生的事情是uint8_t 正在将promoted 转换为int,因为小于int 的所有内容都将转换为int,然后才能相乘/相加/等等。

您无法阻止此操作,但可以将其转换回(通过将其分配给 uint8_t 变量或将其转换为 static_cast&lt;uint8_t&gt;(a * b)

【讨论】:

以上是关于如果 uint8_t 值乘以 uint8_t 是啥类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

uint8_t 类型的 sscanf 占位符是啥?

将这个模板函数专门用于 int8_t 和 uint8_t 的更好方法是啥?

从 Keil 中的 uint8_t 数组获取 uint16_t 值

SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器

以编程方式填充 uint8_t 数组

如何将字符数组转换为 uint8_t