混合整数类型的 C++ 算术导致溢出

标签 c++ integer-overflow type-promotion

我在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.

不,升级发生在 + 求值之前,而不是之后。当 ab 均为正数时,就会发生加法。两个数字都被提升为 int 进行加法,作为两个正数相加,然后转换为 16 位短整型。在此过程中任何时候结果都不会因溢出而变为负数,因此最终结果为 128。

可以说,这是有道理的:ab 的行为与数学中两个数字的行为相匹配,使其对语言从业者来说更加直观。

关于混合整数类型的 C++ 算术导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20031343/

相关文章:

fortran - ISO_FORTRAN_ENV 或 -fdefault-real-8 将实数提升为 double

java - 完全在 C++ 中使用 OpenCV Android

c++ - 在C++中找到一对椭圆的公切线的首选方法

c++ - QObjects的销毁

c++ - 如何检查 duration_cast 是否溢出

sql - `unknown` 和类型推断的规则是什么?

c++ - 使用 size_type 索引从 std vector 中删除会导致编译器错误?

将 INT_MAX 转换为 float ,然后再转换回整数。

c++ - 在 C++ 中查找大乘法的余数

c - 代码中有多少种类型转换?