c - 表达式溢出
问题描述
#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
,这会导致溢出。我很困扰
解决方案
第一段代码中发生的事情是整数提升的结果。这意味着任何类型小于int
(like char
or ) 的整数值在用于表达式之前short
首先被提升为类型。int
在这种情况下:
c = a + b;
a
并且b
两者都有类型char
,并且它们的值都被提升为int
。所以添加的是int
值 2 和int
值 127,即 129。
第一段代码和第二段代码的区别在于,在第二种情况下没有提升。该变量j
已经具有类型int
,因此不会提升该值。将参数之一转换为long
会导致乘法发生在 type long
。
推荐阅读
- rust - 有没有办法让结构包含可能不再有效的引用?
- javascript - Javascript将字符串拆分为多维数组
- r - 将单行文件读入 R
- javascript - 单击 X 时关闭菜单
- stackexchange.redis - StackExchange.redis - Redis 批处理超时
- python - 可以使用 subprocess.Popen for python3.7 处理命令列表
- django - 我如何将 html 复选框值保存到 django 数据库
- xamarin.forms - Xamarin.Forms 在应用程序上启动或恢复时添加 4 位密码
- c# - 使用Linq获取组中除第一项之外的所有项目的总和?
- javascript - 从另一个网格视图文本框 asp.net 填充网格视图下拉