Cyzyt 发表于 2019-8-12 15:10:51

带你学C带你飞第一季while语句课后动动手2求助

哪位大神可以帮忙看看为什么打印数额超出范围有bug{:10_266:}
#include <stdio.h>
#include <math.h>
#define X int_max
#define N int_min                           
               
int main()
{
      char ch;
      int num=0,over=0;
      long long int temp=0;
      
      const int X=pow(2,31)-1;
      const int N=-pow(2,31);
      
      printf("请输入字符串:");
      
      do{
                ch=getchar();
                if (ch>='0'&&ch<='9'){
                        temp=10*num+(ch-'0');      
                        if (temp>X||temp<N){
                              over=1;break;
                        }
                        else num=temp;
                }
                else if (num) break;
      }while (ch!='\n');
      
      if (over){
                printf("数额超出范围");
      }
      else if (!num&&!temp)
                printf("无有效数额");
      else
                printf("结果为%d",num);
      
      return 0;
}

迷雾少年 发表于 2019-8-12 15:21:33

lz的输入是什么

Cyzyt 发表于 2019-8-13 10:38:02

迷雾少年 发表于 2019-8-12 15:21
lz的输入是什么

什么意思啊{:10_266:}

迷雾少年 发表于 2019-8-13 10:39:28

Cyzyt 发表于 2019-8-13 10:38
什么意思啊

程序的输入,我输了一些好像没问题

Cyzyt 发表于 2019-8-13 14:23:30

迷雾少年 发表于 2019-8-13 10:39
程序的输入,我输了一些好像没问题

我会出现这种
请输入字符串:9999999999999
结果为1316134911
问题
请问是怎么回事呢

迷雾少年 发表于 2019-8-13 14:27:22

Cyzyt 发表于 2019-8-13 14:23
我会出现这种
请输入字符串:9999999999999
结果为1316134911


        const int X = pow(2, 31) - 1;
        const int N = -pow(2, 31);

你这里限定的范围是int变量负最大到正最大的值 你自己用计算器算下2^31-1是多少 你会发现你输入的999.....远比他大,懂我的意思吧

Cyzyt 发表于 2019-8-13 14:38:48

迷雾少年 发表于 2019-8-13 14:27
const int X = pow(2, 31) - 1;
        const int N = -pow(2, 31);



所以应该输出数额超出范围才对啊

迷雾少年 发表于 2019-8-13 14:46:12

Cyzyt 发表于 2019-8-13 14:38
所以应该输出数额超出范围才对啊

因为你中间变量范围是int,你不断地*10+ch-'0' 他就会不断溢出的怎么也不会 不符合 temp>X || temp< N的

Cyzyt 发表于 2019-8-13 14:50:03

迷雾少年 发表于 2019-8-13 14:46
因为你中间变量范围是int,你不断地*10+ch-'0' 他就会不断溢出的怎么也不会 不符合 temp>X || temp< N的

什么叫溢出啊{:10_266:}

迷雾少年 发表于 2019-8-13 14:52:14

Cyzyt 发表于 2019-8-13 14:50
什么叫溢出啊

就是你int范围 最大是2^32-1最小是-2^31 你中间变量temp是int变量 你无论怎么加他都不会超出他自身范围吧temp > X || temp < N,加多了超出的就没了。

Cyzyt 发表于 2019-8-13 15:10:41

迷雾少年 发表于 2019-8-13 14:52
就是你int范围 最大是2^32-1最小是-2^31 你中间变量temp是int变量 你无论怎么加他都不会超出他自身范围 ...

我的temp不是定义的long long int 吗{:10_291:}

Cyzyt 发表于 2019-8-13 15:14:12

Cyzyt 发表于 2019-8-13 15:10
我的temp不是定义的long long int 吗

啊我知道了,是num

Cyzyt 发表于 2019-8-13 15:17:48

迷雾少年 发表于 2019-8-13 14:52
就是你int范围 最大是2^32-1最小是-2^31 你中间变量temp是int变量 你无论怎么加他都不会超出他自身范围 ...

谢谢大神{:10_298:}

迷雾少年 发表于 2019-8-13 15:18:11

Cyzyt 发表于 2019-8-13 15:17
谢谢大神

okok{:10_256:}
页: [1]
查看完整版本: 带你学C带你飞第一季while语句课后动动手2求助