鱼C论坛

 找回密码
 立即注册
查看: 1599|回复: 13

[已解决]带你学C带你飞第一季while语句课后动动手2求助

[复制链接]
发表于 2019-8-12 15:10:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
哪位大神可以帮忙看看为什么打印数额超出范围有bug
#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-13 14:46:12
Cyzyt 发表于 2019-8-13 14:38
所以应该输出数额超出范围才对啊

因为你中间变量范围是int,你不断地*10+ch-'0' 他就会不断溢出的怎么也不会 不符合 temp>X || temp< N的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-12 15:21:33 | 显示全部楼层
lz的输入是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-13 10:38:02 | 显示全部楼层

什么意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-13 10:39:28 | 显示全部楼层

程序的输入,我输了一些好像没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-13 14:23:30 | 显示全部楼层
迷雾少年 发表于 2019-8-13 10:39
程序的输入,我输了一些好像没问题

我会出现这种
请输入字符串:9999999999999
结果为1316134911
问题
请问是怎么回事呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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.....远比他大,懂我的意思吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-13 14:38:48 | 显示全部楼层
迷雾少年 发表于 2019-8-13 14:27
const int X = pow(2, 31) - 1;
        const int N = -pow(2, 31);

所以应该输出数额超出范围才对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-13 14:46:12 | 显示全部楼层    本楼为最佳答案   
Cyzyt 发表于 2019-8-13 14:38
所以应该输出数额超出范围才对啊

因为你中间变量范围是int,你不断地*10+ch-'0' 他就会不断溢出的怎么也不会 不符合 temp>X || temp< N的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

什么叫溢出啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-13 14:52:14 | 显示全部楼层

就是你int范围 最大是2^32-1  最小是-2^31 你中间变量temp是int变量 你无论怎么加他都不会超出他自身范围吧temp > X || temp < N,加多了超出的就没了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的temp不是定义的long long int 吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-13 15:14:12 | 显示全部楼层
Cyzyt 发表于 2019-8-13 15:10
我的temp不是定义的long long int 吗

啊我知道了,是num
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-13 15:18:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表