如果 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;
程序的输出是9506。 a * b
会是 uint32_t
类型数据吗?
为什么不仍然是 uint8_t
类型?
谢谢。
【问题讨论】:
C++ 程序计算表达式的最小整数类型是int
。任何较小的类型sizeof(uint_8) < 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<uint8_t>(a * b)
)
【讨论】:
以上是关于如果 uint8_t 值乘以 uint8_t 是啥类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将这个模板函数专门用于 int8_t 和 uint8_t 的更好方法是啥?
从 Keil 中的 uint8_t 数组获取 uint16_t 值