C和C++中整数计算的溢出

Sil*_*cer 1 c c++ integer-overflow

请检查以下代码段:

  unsigned char a = 100;
  unsigned char b = 100;
  unsigned char c = 100;
  unsigned short x = a * b + c;
Run Code Online (Sandbox Code Playgroud)

我预计这会溢出,计算将在8位类型的unsigned char(不是16位无符号short)中完成,超过unsigned char的值范围.但事实并非如此.

为什么计算不会在C和C++中溢出?

Tam*_*ola 8

[...]算术运算符不接受小于int的类型作为参数,并且在左值到右值转换后自动应用积分促销(如果适用).

http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion

所以你的代码行为如下:

unsigned char a = (unsigned char)100;
unsigned char b = (unsigned char)100;
unsigned char c = (unsigned char)100;
unsigned short x = (unsigned short)((int)a * (int)b + (int)c);
Run Code Online (Sandbox Code Playgroud)