AdiosSpike 发表于 2021-10-22 18:03:53

可能和溢出有关的问题


#include<stdio.h>

int main()
{
    long long unsigned intb = 11*12*13*14*15,a = 1*2*3*4*5*6*7*8*9*10*b;


    printf("%llu",a);

    return 0;
}



#include<stdio.h>

int main()
{
    long long unsigned inta = 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15;


    printf("%llu",a);

    return 0;
}




就第一种写法好像算出来是对的,但是第二种写法算出来不对,是因为什么


hrpzcf 发表于 2021-10-22 18:24:03

因为C语言中十进制字面量默认是int类型的,所以第二种写法a右边都默认是int类型,算到12后已经溢出了,所以结果不对,不对的结果赋值给long long unsigned也一样不对。
改一下让右边的字面量默认llu就可以了:
#include<stdio.h>

int main()
{
    long long unsigned inta = 1LLU*2*3*4*5*6*7*8*9*10*11*12*13*14*15;


    printf("%llu",a);

    return 0;
}

傻眼貓咪 发表于 2021-10-22 18:36:01

本帖最后由 傻眼貓咪 于 2021-10-22 18:38 编辑

#include<stdio.h>

int main()
{
    long long unsigned int a = 1*2*3*4*5*6*7*8*9*10*11*12*13ll*14ll*15ll; // 第 13 开始后缀加 ll 避免溢出
    printf("%llu\n",a);
    return 0;
}

1*2*3*4*5*6*7*8*9*10*11*12 = 479001600 (小于 4 字节:2147483647)
1*2*3*4*5*6*7*8*9*10*11*12*13 = 6227020800 (大于 4 字节:6227020800)

人造人 发表于 2021-10-22 18:56:49

傻眼貓咪 发表于 2021-10-22 18:36
1*2*3*4*5*6*7*8*9*10*11*12 = 479001600 (小于 4 字节:2147483647)
1*2*3*4*5*6*7*8*9*10*11*12*1 ...

加一个就可以,编译器会自动转换类型

#include<stdio.h>

int main()
{
    long long unsigned inta = 1ll*2*3*4*5*6*7*8*9*10*11*12*13*14*15;


    printf("%llu\n",a);

    return 0;
}

傻眼貓咪 发表于 2021-10-22 19:12:41

人造人 发表于 2021-10-22 18:56
加一个就可以,编译器会自动转换类型

感谢,受教了{:5_105:}

AdiosSpike 发表于 2021-10-22 20:24:09

hrpzcf 发表于 2021-10-22 18:24
因为C语言中十进制字面量默认是int类型的,所以第二种写法a右边都默认是int类型,算到12后已经溢出了,所以 ...

非常感谢

AdiosSpike 发表于 2021-10-22 20:26:12

傻眼貓咪 发表于 2021-10-22 18:36
1*2*3*4*5*6*7*8*9*10*11*12 = 479001600 (小于 4 字节:2147483647)
1*2*3*4*5*6*7*8*9*10*11*12*1 ...

谢谢你,第二次看到你回答问题,二楼比你先回答一些,所以把它设为了最佳,但真的很感谢你{:10_281:}

傻眼貓咪 发表于 2021-10-22 20:26:50

AdiosSpike 发表于 2021-10-22 20:26
谢谢你,第二次看到你回答问题,二楼比你先回答一些,所以把它设为了最佳,但真的很感谢你

没有关系,共同学习{:5_105:}
页: [1]
查看完整版本: 可能和溢出有关的问题