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

Overflow of integer calculation in C and C++

请检查以下代码段:

  unsigned char a = 100;
  unsigned char b = 100;
  unsigned char c = 100;
  unsigned short x = a * b + c;

我预计这会溢出并且计算将以8位类型的unsigned char(而不是16位unsigned short)进行计算,超出了unsigned char的取值范围。但事实并非如此。

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

[...] arithmetic operators do not accept types smaller than int as arguments, and integral promotions are automatically applied after lvalue-to-rvalue conversion, if applicable.

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);