imbA丶 发表于 2019-6-2 23:06:50

数字溢出

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

人造人 发表于 2019-6-2 23:09:53

‘^’在C语言中不是乘方,而是按位异或

imbA丶 发表于 2019-6-2 23:13:30

人造人 发表于 2019-6-2 23:09
‘^’在C语言中不是乘方,而是按位异或

老哥那正常应该怎么打才能表示我想要的形式

我叫MD 发表于 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)这样就好了

imbA丶 发表于 2019-6-2 23:19:45

我叫MD 发表于 2019-6-2 23:18
使用 pow 函数

我把那个改成i>(pow(2,32)-1)
还是没用加了math.h这个文件

人造人 发表于 2019-6-2 23:21:29

imbA丶 发表于 2019-6-2 23:13
老哥那正常应该怎么打才能表示我想要的形式

自己百度,关键字搜索:C语言pow函数

我叫MD 发表于 2019-6-2 23:25:41

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

你能给加个图片看下运行结果吗?

imbA丶 发表于 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新人

我叫MD 发表于 2019-6-2 23:50:52

imbA丶 发表于 2019-6-2 23:32
我不知道怎么给图,sorry新人

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

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

如果成功了,希望采纳一下哦

imbA丶 发表于 2019-6-2 23:53:00

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

失败了。。。{:10_266:}

我叫MD 发表于 2019-6-2 23:59:41

imbA丶 发表于 2019-6-2 23:53
失败了。。。

你运行程序是怎么说的   我这边亲测没问题啊

imbA丶 发表于 2019-6-3 00:04:53

谢谢, 我把i的类型变成float,然后就OK了谢谢两位大佬 爱你们 晚安

bin554385863 发表于 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>
页: [1]
查看完整版本: 数字溢出