可能和溢出有关的问题
#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;
}
就第一种写法好像算出来是对的,但是第二种写法算出来不对,是因为什么
因为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: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: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 18:56
加一个就可以,编译器会自动转换类型
感谢,受教了{:5_105:} hrpzcf 发表于 2021-10-22 18:24
因为C语言中十进制字面量默认是int类型的,所以第二种写法a右边都默认是int类型,算到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:} AdiosSpike 发表于 2021-10-22 20:26
谢谢你,第二次看到你回答问题,二楼比你先回答一些,所以把它设为了最佳,但真的很感谢你
没有关系,共同学习{:5_105:}
页:
[1]