【发布时间】:2016-01-02 18:09:44
【问题描述】:
我有以下代码:
#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 测试)?
【问题讨论】:
-
这似乎是relevant(促销至少在C和C++中是相似的,如果不一样的话)。
-
是的,任何小于
int的类型都会提升为int进行算术运算。 -
还要避免
reinterpret_cast,它是实现定义的。
标签: c++