我在VC++2010中做了一些测试,混合不同大小的操作数导致加法运算溢出:
int _tmain(int argc, _TCHAR* argv[])
{
__int8 a=127;
__int8 b=1;
__int16 c=b+a;
__int8 d=b+a;
printf("c=%d,d=%d\n",c,d);
return 0;
}
//result is: c=128, d=-128
我不明白为什么c==128!我的理解是,在这两种加法中,b+a仍然被认为是2个有符号8位变量的加法。所以结果是溢出,即-128。 之后,第一次赋值操作的结果将提升为 16 位有符号 int,并且 c 仍应获得 16 位 -128 值。我的理解正确吗? C++ 标准有点难以阅读。第 4 章似乎在讨论整数提升,但我找不到与此特定示例相关的任何内容。
最佳答案
My understanding is that in both additions, b+a are still considered addition of 2 signed 8 bit variables. So the result is an overflow i.e. -128.
不,升级发生在 +
求值之前,而不是之后。当 a
和 b
均为正数时,就会发生加法。两个数字都被提升为 int 进行加法,作为两个正数相加,然后转换为 16 位短整型。在此过程中任何时候结果都不会因溢出而变为负数,因此最终结果为 128。
可以说,这是有道理的:a
和 b
的行为与数学中两个数字的行为相匹配,使其对语言从业者来说更加直观。
关于混合整数类型的 C++ 算术导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20031343/