C++中数学计算中的内部时间变量

fee*_*ree 2 c++ casting integer-overflow

以下示例用于说明我的问题:

#include <iostream>
#include <string>

int main()
{

  signed char p;
  signed char temp=100;
  signed char t=4;
  p = (temp+temp+temp+temp)/t;
  std::cout << "Hello, " << int(p)<< "!\n";
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,变量p被定义为四个singed char变量的平均值.但是,signed char变量(temp + temp + temp + temp)的总和将大于signed char的范围.所以我的问题是C++如何处理这种情况.

Sla*_*ica 7

但是,signed char变量(temp + temp + temp + temp)的总和将大于signed char的范围.

这不要紧,因为char将晋升为intintegral promotion.细节可以在这里找到.因此,操作将在类型上完成int,您将获得预期的结果.


xva*_*van 5

没有任何事情发生,因为整体推广

小整数类型(例如char)的Prvalues可以转换为更大整数类型(例如int)的prvalues.特别是,算术运算符不接受小于int的类型作为参数,并且在左值到右值转换后自动应用整数促销(如果适用).此转换始终保留该值.

(temp+temp+temp+temp) 将返回一个整数.

(temp+temp+temp+temp)/t 将在char范围内.

所以 p == temp