溢出

变量类型选择与整数溢出问题

在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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注