我尝试了以下代码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进行了测试。
答案 0 :(得分:4)
您的代码行为未定义,因为最终您会溢出signed
整数类型。
如果您想了解数据类型的各种限制,请在您的情况下使用
std::numeric_limits<short>::min()
和std::numeric_limits<short>::max()
等
不要依赖签名的柜台&#34;时钟&#34;从最大值到最小值的舍入。
答案 1 :(得分:3)
回答你的问题:“为什么编译器在它们都很短的时候会扩展int的参数?”答案是“因为标准说它必须”。实际上比int
窄的带符号操作数的所有算术运算必须首先扩展到int
。 (实际上比int
更窄的操作数可能会char
,short
和wchar_t
取决于i
。
当某些参数未签名时的规则更复杂(我永远不会记住它们)。
除此之外:正如其他人所说,如果溢出签名类型,编译器可以生成格式化硬盘的代码。不要这样做。特别是,GCC很可能发现i
从零开始并递增,因此它总是大于零并删除测试 - 所以你将有一个无限循环。
答案 2 :(得分:0)
我可以看到逻辑是这样的,它只会显示一个MIN。可能需要更改代码中的比较逻辑以获得MAX和MIN。
即.. if (i + (short) 1 > (short) 0)
此外,不要忘记限制值的数量,否则你将以无限循环结束