鱼C论坛

 找回密码
 立即注册
查看: 1914|回复: 12

[已解决]数字溢出

[复制链接]
发表于 2019-6-2 23:06:50 | 显示全部楼层 |阅读模式

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

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

x
源代码:
#include<stdio.h>
int main()
{
        int i;
        printf("请输入数字:");
        scanf("%d",&i);
        if(i>2^32-1)
        {
                printf("数字溢出");
        }
}
为什么输入一个很小的数字还是会显示数字溢出啊
最佳答案
2019-6-2 23:59:41

你运行程序是怎么说的   我这边亲测没问题啊
微信图片_20190602230255.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-2 23:09:53 | 显示全部楼层
‘^’在C语言中不是乘方,而是按位异或
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 23:13:30 | 显示全部楼层
人造人 发表于 2019-6-2 23:09
‘^’在C语言中不是乘方,而是按位异或

老哥  那正常应该怎么打才能表示我想要的形式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:18:10 | 显示全部楼层
本帖最后由 我叫MD 于 2019-6-2 23:20 编辑
imbA丶 发表于 2019-6-2 23:13
老哥  那正常应该怎么打才能表示我想要的形式


使用 pow 函数
#include <math.h> //需要包含的头文件

int main()
{
        int j;
        j = pow(2, 32) - 1;

        //pow(x,y);   意思是x的y次幂
        return 0;
}

if(i > j)这样就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 23:19:45 | 显示全部楼层

我把那个改成i>(pow(2,32)-1)
还是没用  加了math.h这个文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:21:29 | 显示全部楼层
imbA丶 发表于 2019-6-2 23:13
老哥  那正常应该怎么打才能表示我想要的形式

自己百度,关键字搜索:C语言pow函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:25:41 | 显示全部楼层
imbA丶 发表于 2019-6-2 23:19
我把那个改成i>(pow(2,32)-1)
还是没用  加了math.h这个文件

你能给加个图片看下运行结果吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 23:32:54 | 显示全部楼层
我叫MD 发表于 2019-6-2 23:25
你能给加个图片看下运行结果吗?
#include<stdio.h>
#include<math.h>
int main()
{
        int i;
        printf("请输入数字:");
        scanf("%d",&i);
        if(i>(pow(2,32)-1))
        {
                printf("数字溢出");
        }
        
}
我不知道怎么给图,sorry  新人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:50:52 | 显示全部楼层
imbA丶 发表于 2019-6-2 23:32
我不知道怎么给图,sorry  新人


我解释一下:pow的返回值是double类型,而返回的值(也就是2的32次方已经超出了double所能存储的值了),当超出的时候,就变成负数了,所以你随便输入一个数都大于返回的负数;

你把32改成31就不会这样了,试试看

如果成功了,希望采纳一下哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 23:53:00 | 显示全部楼层
我叫MD 发表于 2019-6-2 23:50
我解释一下:pow的返回值是double类型,而返回的值(也就是2的32次方已经超出了double所能存储的值了) ...

失败了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-2 23:59:41 | 显示全部楼层    本楼为最佳答案   

你运行程序是怎么说的   我这边亲测没问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 00:04:53 | 显示全部楼层
谢谢, 我把i的类型变成float,然后就OK了  谢谢两位大佬 爱你们 晚安
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 00:13:30 | 显示全部楼层
本帖最后由 bin554385863 于 2019-6-3 00:16 编辑
#include <stdio.h>
#include <math.h>
int main(int argc, char const *argv[])
{
    int i = 0;
    printf("请输入数值\n");
    scanf("%d", &i);
    if (i >= (long long)pow(2, 32))//double 类型不足以存放这么大的数字,强制转换成long long类型,或者float才行
    {
        printf("数字溢出");
    }
    else
    {
       printf("范围正常\n数字上限是:%lld", (long long)pow(2,32));
    }
    
    
}
------------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-bz35d0ub.s3m --stdout=Microsoft-MIEngine-Out-cp30lsys.2fd --stderr=Microsoft-MIEngine-Error-1g1iyetw.py4 --pid=Microsoft-MIEngine-Pid-b3yvjt4c.5j5 --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
请输入数值
1000000000000
范围正常
数字上限是:4294967296
E:\Administrator\Documents\My C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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