变量类型选择与整数溢出问题
在C语言编程中,必须仔细选择计算过程中使用的变量类型,以确保其能容纳期望的值。如果使用了过小的类型,程序会出现难以排查的错误(如整数溢出)。
1. 错误示例与溢出原因
在初始代码中,三个月的股票销量(23500、19300、21600)均在 short 类型范围内,但总和(64400)超过了 short 的最大值(32767)。
short QuarterSold = JanSold+FebSold+MarSold; // 总和64400溢出Code language: JavaScript (javascript)
现象:由于 short 类型无法存储 64400,发生溢出后数据回绕,导致输出负数(-1136),进而使后续销售额计算结果错误($-31.50)。
本质:short 通常占用2字节(上限32767),存储超范围数据会导致高位截断,变成补码形式的负数。
2. 修复方案:扩大变量类型
将总计变量 QuarterSold 改为更大的类型(如 long),并配套修改格式说明符。
关键修改点:
- 声明改为:
long QuarterSold = JanSold+FebSold+MarSold; - 输出改为:
printf("\n一季度的股票销售总额: %ld", QuarterSold);(使用%ld匹配long类型)
3. 修正后的完整代码
#include <stdio.h>
#include <limits.h> // 用于输出类型极限值
int main(void)
{
// 打印类型极限值辅助观察
printf("short最大值: %d\n", SHRT_MAX);
printf("long最大值: %ld\n", LONG_MAX);
const float Revenue_Per_150 = 4.5f;
short JanSold = 23500; /* 1月份卖出的股票 */
short FebSold = 19300; /* 2月份卖出的股票 */
short MarSold = 21600; /* 3月份卖出的股票 */
float RevQuarter = 0.0f; /* 本季度销售额 */
long QuarterSold = JanSold + FebSold + MarSold; /* 总计一季度,用long防溢出 */
/* 输出月度销量和总额 */
printf("\n股票销售情况:\n 1月: %d\n 2月: %d\n 3月: %d", JanSold, FebSold, MarSold);
printf("\n一季度的股票销售总额: %ld", QuarterSold);
/* 计算销售额并输出 */
RevQuarter = QuarterSold / 150 * Revenue_Per_150;
printf("\nSales revenue this quarter is:$%.2f\n", RevQuarter);
return 0;
}Code language: PHP (php)
预期正确输出:
- 销售总额:64400
- 销售额:$1932.00
Previous: sizeof 运算符
Next: 类型转换