【问题标题】:Expression overflow [duplicate]表达式溢出[重复]
【发布时间】:2020-02-20 11:24:02
【问题描述】:
#include <stdio.h>
int main(void)
{
    char a, b;
    int c;

    b = 2;
    a = 127;
    c = a + b;
    printf("%d", c);
}

我认为 c 的值应该是 -127,但实际上当我运行这个测试时,值是 129。

根据&lt;&lt;c pragramming:a morden approach&gt;&gt;的例子,

long int i;
int j=1000;

i=j*j;  /*overflow may occur,correct writing is i=(long)i*i;

这里是书上的解释——当两个int类型的值相乘时,结果应该也是int,但是j * j的结果太大了不一致,在有些机器上不能用int表示,导致溢出。

所以我认为在我的测试中,(a+b) 的类型是 char,因为129&gt;127..char 不能表达129,这会导致溢出。 我很困惑

【问题讨论】:

  • "(a+b) 的类型是 char" 你为什么这么认为?

标签: c


【解决方案1】:

第一段代码中发生的事情是整数提升的结果。这意味着任何类型小于int(如charshort)的整数值在用于表达式之前首先被提升为int 类型。

在这种情况下:

 c = a + b;

ab 都具有char 类型,并且它们的值都提升为int。所以添加的是 int 值 2 和 int 值 127,即 129。

第一段代码和第二段代码的区别在于,在第二种情况下不会发生任何提升。变量j 已经具有int 类型,因此不会提升该值。将参数之一强制转换为 long 会导致类型为 long 的乘法发生。

【讨论】:

  • 整数提升适用于将值用作某些运算符的操作数时。这在标准中的每个此类运算符下都有规定。还有许多其他表达式没有提升值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多