短类型的C ++溢出

时间:2016-02-01 08:50:53

标签: c++ overflow short

我尝试了以下代码snipped

<div class="dd">
  <div class="d1"></div>
  <div class="d2"></div>
  <div class="d3"></div>
</div>

我希望此代码输出int main() { short i = 0; do { if (i + (short) 1 < (short) 0) std::cout << "MAX: " << i << std::endl; i++; } while (i > 0); std::cout << "MIN: " << i << std::endl; return 0; } 类型的最大值和最小值。但它只输出最小值:

  

MIN:-32768

我想short循环内的比较是使用for类型计算的。但是我不明白为什么如果所有参数都有int类型,编译器会执行扩展。

我使用MS Visual Studio 2013 x32 build进行了测试。

3 个答案:

答案 0 :(得分:4)

您的代码行为未定义,因为最终您会溢出signed整数类型。

如果您想了解数据类型的各种限制,请在您的情况下使用

std::numeric_limits<short>::min()std::numeric_limits<short>::max()

不要依赖签名的柜台&#34;时钟&#34;从最大值到最小值的舍入。

答案 1 :(得分:3)

回答你的问题:“为什么编译器在它们都很短的时候会扩展int的参数?”答案是“因为标准说它必须”。实际上比int窄的带符号操作数的所有算术运算必须首先扩展到int。 (实际上比int更窄的操作数可能会charshortwchar_t取决于i

当某些参数未签名时的规则更复杂(我永远不会记住它们)。

除此之外:正如其他人所说,如果溢出签名类型,编译器可以生成格式化硬盘的代码。不要这样做。特别是,GCC很可能发现i从零开始并递增,因此它总是大于零并删除测试 - 所以你将有一个无限循环。

答案 2 :(得分:0)

我可以看到逻辑是这样的,它只会显示一个MIN。可能需要更改代码中的比较逻辑以获得MAX和MIN。

即.. if (i + (short) 1 > (short) 0)

此外,不要忘记限制值的数量,否则你将以无限循环结束