我有以下代码片段:
我知道
问题在于,这种情况下,它说
所以,我的问题是: 这是预期行为(即 unsigned char - unsigned char 得到 int),还是某种奇怪的编译器错误(已测试使用 GCC 和 clang)?
code:
#include <cstdint>
template <typename T>
T test(T a, T b)
{
float aabb = reinterpret_cast<float>(a - b);
}
int main(int argc, const char *argv[])
{
std::uint8_t a8, b8;
test(a8, b8);
return 0;
}
我知道
reinterpret_cast<float>
无法工作并且会在编译时出现错误。我利用这个错误来让编译器告诉我 a - b
的类型。问题在于,这种情况下,它说
a - b
的类型为 int
,当它们两个都是 uint8_t (unsigned char)
时也是如此。对于 uint16_t
也是一样的。但是对于 uint32_t
,它会说 a - b
的类型是 unsigned int
。所以,我的问题是: 这是预期行为(即 unsigned char - unsigned char 得到 int),还是某种奇怪的编译器错误(已测试使用 GCC 和 clang)?
int
更小的类型在算术运算中都会提升为int
。 - ShadowRangerreinterpret_cast
,因为它的行为是由实现定义的。 - vsoftco