对于下面的代码,我得到了一个溢出,但不幸的是,我似乎不能理解为什么。
std::int8_t smallValue = -1;
unsigned int value = 500;
std::uint8_t anotherSmallValue = 1;
auto test = smallValue * value * anotherSmallValue;之后,test是一个相当大的值。
有人能解释一下,这里发生了什么吗?
发布于 2013-04-05 20:57:29
当编译器看到smallValue * value时,它必须在给定输入数据类型signed (8位)和unsigned int (通常是16位或32位)的情况下决定结果的数据类型。C++的规则规定,在这种情况下,结果将是无符号的。因此,smallValue * value的值不能像您预期的那样为-500;相反,值-500被解释为正数。
此外,您在这里将一个8位值乘以一个通常为16位或32位的值。此场景中的C++规则规定,较小的存储值将首先转换为与较大的存储值相同的大小;因此,在这种情况下,smallValue * value的结果将确实足够大,以存储大量的幅度500。
继续乘以无符号数量anotherSmallValue (=1)会得到另一个具有相同值的unsigned。
因为您使用的是auto,所以返回类型被推断为unsigned。
通过简单地转换回signed (例如,通过将值test定义为int,而不是auto ),通常会将整个操作的结果转换回signed值,而不会在内部更改位;这将正确地显示-500,正如您所预期的那样;然而,正如其他发帖者所指出的,这在理论上是相当危险的,因为它在技术上不能保证工作,尽管它通常会以这种方式在当今的编译器中工作。
https://stackoverflow.com/questions/15834326
复制相似问题