【问题标题】:Internal temporal variable in mathematic calculation in C++C++数学计算中的内部临时变量
【发布时间】:2016-03-09 16:30:37
【问题描述】:

下面的例子用来说明我的问题:

#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变量的平均值。但是,有符号字符变量(temp+temp+temp+temp)的总和将大于有符号字符的范围。所以我的问题是 C++ 如何处理这种情况。

【问题讨论】:

  • 如果您混合了有符号和无符号变量,您可能需要进行显式转换以确保一切都以您想要的方式出现。你的例子没有这个问题。

标签: c++ casting integer-overflow


【解决方案1】:

但是,有符号字符变量(temp+temp+temp+temp)的总和会大于有符号字符的范围。

这没关系,因为char 将被提升为int,因为integral promotion。详情请见here。所以操作将在int 类型上完成,你会得到预期的结果。

【讨论】:

  • int 不能容纳 400 的平台是非法的,因为 INT_MAX 必须至少为 32767。
【解决方案2】:

什么都没有发生,因为integral promotion

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

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

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

所以p == temp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2021-03-29
    • 2013-01-23
    相关资源
    最近更新 更多