首页 > 解决方案 > 表达式溢出

问题描述

#include <stdio.h>
int main(void)
{
    char a, b;
    int c;

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

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

根据一个例子<<c pragramming:a morden approach>>

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>127..char 不能表达129,这会导致溢出。我很困扰

标签: c

解决方案


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

在这种情况下:

 c = a + b;

a并且b两者都有类型char,并且它们的值都被提升为int。所以添加的是int值 2 和int值 127,即 129。

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


推荐阅读