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

时间:2016-03-09 16:30:37

标签: 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";
}

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

2 个答案:

答案 0 :(得分:7)

  

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

由于char int将被提升为integral promotion,因此无关紧要。可以找到详细信息here。因此,操作将在int类型上完成,您将获得预期的结果。

答案 1 :(得分:5)

由于integral promotion

,没有任何事情发生
  

小积分类型(例如char)的Prvalues可以转换为   较大整数类型的prvalues(例如int)。特别是,   算术运算符不接受小于int的类型   参数和积分促销会在之后自动应用   如果适用,左值到右值的转换。总是这种转换   保留价值。

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

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

所以p == temp