鱼C论坛

 找回密码
 立即注册
查看: 1173|回复: 7

[已解决]可能和溢出有关的问题

[复制链接]
发表于 2021-10-22 18:03:53 | 显示全部楼层 |阅读模式

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

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

x

  1. #include<stdio.h>

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


  5.     printf("%llu",a);

  6.     return 0;
  7. }
复制代码


  1. #include<stdio.h>

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


  5.     printf("%llu",a);

  6.     return 0;
  7. }
复制代码




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


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

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


  5.     printf("%llu",a);

  6.     return 0;
  7. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-22 18:24:03 | 显示全部楼层    本楼为最佳答案   
因为C语言中十进制字面量默认是int类型的,所以第二种写法a右边都默认是int类型,算到12后已经溢出了,所以结果不对,不对的结果赋值给long long unsigned也一样不对。
改一下让右边的字面量默认llu就可以了:
  1. #include<stdio.h>

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


  5.     printf("%llu",a);

  6.     return 0;
  7. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 18:36:01 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-22 18:38 编辑
  1. #include<stdio.h>

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


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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 ...

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

  1. #include<stdio.h>

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


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

  6.     return 0;
  7. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 19:12:41 | 显示全部楼层
人造人 发表于 2021-10-22 18:56
加一个就可以,编译器会自动转换类型

感谢,受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 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 ...

谢谢你,第二次看到你回答问题,二楼比你先回答一些,所以把它设为了最佳,但真的很感谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没有关系,共同学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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