鱼C论坛

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

[已解决]有关unsigned 问题

[复制链接]
发表于 2022-1-11 21:36:58 | 显示全部楼层 |阅读模式
5鱼币
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.         int i=0;
  6.         unsigned  long long  sum=0;
  7.         unsigned long long result;
  8.         for(i;i<64;i++)
  9.                 sum = sum +pow(2,i);
  10.         result = sum/25000;
  11.         printf("%llu",result);
  12.         return 0;
  13. }
复制代码

这样子的结果为什么是0?跟用temp= pow(2,i)有什么区别?
最佳答案
2022-1-11 21:36:59
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long sum = 0;
  6.     unsigned long long result;
  7.    
  8.     for(int i = 0; i < 64; i++)
  9.     sum = sum + (unsigned long long)pow(2, i); // <---------- 注意这里 ----------
  10.    
  11.     result = sum/25000;
  12.     printf("%llu", result);
  13.    
  14.     return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-11 21:36:59 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     unsigned long long sum = 0;
  6.     unsigned long long result;
  7.    
  8.     for(int i = 0; i < 64; i++)
  9.     sum = sum + (unsigned long long)pow(2, i); // <---------- 注意这里 ----------
  10.    
  11.     result = sum/25000;
  12.     printf("%llu", result);
  13.    
  14.     return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:09:41 | 显示全部楼层

请问那里改是因为什么哇?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:22:50 From FishC Mobile | 显示全部楼层
1449620085 发表于 2022-1-12 10:09
请问那里改是因为什么哇?

因为 pow() 返回类型 double,而我们要的是 unsigned long long

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
1449620085 + 3 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:54:36 | 显示全部楼层
傻眼貓咪 发表于 2022-1-12 10:22
因为 pow() 返回类型 double,而我们要的是 unsigned long long

int main()
{
        unsigned long long sum = 0;
        unsigned long long temp;
        unsigned long long weight;
        int i;

        for (i=0; i < 64; i++)
        {
                temp = pow(2, i);
                sum = sum + temp;
        }
那这里的pow不加unsigned long long 是因为前面的temp被定义了数据类型吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 12:05:57 From FishC Mobile | 显示全部楼层
1449620085 发表于 2022-1-12 10:54
int main()
{
        unsigned long long sum = 0;

也可以这么说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:04:31 | 显示全部楼层
傻眼貓咪 发表于 2022-1-12 10:22
因为 pow() 返回类型 double,而我们要的是 unsigned long long

那就是说数据类型不同的进行相加结果会等于0??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:13:46 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5.         int i=0;
  6.         long long  sum=0;
  7.         long long result;
  8.         for(i;i<64;i++)
  9.            sum = sum +(long long)pow(2,i);
  10.         result = sum/25000;
  11.         printf("%lld",result);
  12.         return 0;
  13. }
  14. 这样我把unsigned 去掉,为什么结果也是等于0呢?
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 15:16:57 | 显示全部楼层
waixiong 发表于 2022-1-23 15:04
那就是说数据类型不同的进行相加结果会等于0??

不是的,是因为数据太大了,只能用 unsigned long long 类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 17:00:02 | 显示全部楼层
傻眼貓咪 发表于 2022-1-23 15:16
不是的,是因为数据太大了,只能用 unsigned long long 类型

那为啥结果等于0嘞?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 17:12:14 | 显示全部楼层
waixiong 发表于 2022-1-23 17:00
那为啥结果等于0嘞?


因为数据太大了,溢出吧:
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.     int i = 0;
  6.     long long sum = 0;
  7.     long long result;
  8.     for(i; i < 64; i++){
  9.         sum = sum +(long long)pow(2, i);
  10.         printf("第%d次:%lld\n", i, sum); // 打印每次循环结果
  11.     }
  12.     result = sum/25000;
  13.     printf("%lld", result);
  14.     return 0;
  15. }
复制代码
输出结果:
  1. 第0次:1
  2. 第1次:3
  3. 第2次:7
  4. 第3次:15
  5. 第4次:31
  6. 第5次:63
  7. 第6次:127
  8. 第7次:255
  9. 第8次:511
  10. 第9次:1023
  11. 第10次:2047
  12. 第11次:4095
  13. 第12次:8191
  14. 第13次:16383
  15. 第14次:32767
  16. 第15次:65535
  17. 第16次:131071
  18. 第17次:262143
  19. 第18次:524287
  20. 第19次:1048575
  21. 第20次:2097151
  22. 第21次:4194303
  23. 第22次:8388607
  24. 第23次:16777215
  25. 第24次:33554431
  26. 第25次:67108863
  27. 第26次:134217727
  28. 第27次:268435455
  29. 第28次:536870911
  30. 第29次:1073741823
  31. 第30次:2147483647
  32. 第31次:4294967295
  33. 第32次:8589934591
  34. 第33次:17179869183
  35. 第34次:34359738367
  36. 第35次:68719476735
  37. 第36次:137438953471
  38. 第37次:274877906943
  39. 第38次:549755813887
  40. 第39次:1099511627775
  41. 第40次:2199023255551
  42. 第41次:4398046511103
  43. 第42次:8796093022207
  44. 第43次:17592186044415
  45. 第44次:35184372088831
  46. 第45次:70368744177663
  47. 第46次:140737488355327
  48. 第47次:281474976710655
  49. 第48次:562949953421311
  50. 第49次:1125899906842623
  51. 第50次:2251799813685247
  52. 第51次:4503599627370495
  53. 第52次:9007199254740991
  54. 第53次:18014398509481983
  55. 第54次:36028797018963967
  56. 第55次:72057594037927935
  57. 第56次:144115188075855871
  58. 第57次:288230376151711743
  59. 第58次:576460752303423487
  60. 第59次:1152921504606846975
  61. 第60次:2305843009213693951
  62. 第61次:4611686018427387903
  63. 第62次:9223372036854775807
  64. 第63次:-1
  65. 0
复制代码
最后一次 sum 溢出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 17:45:31 | 显示全部楼层
傻眼貓咪 发表于 2022-1-23 17:12
因为数据太大了,溢出吧:输出结果:最后一次 sum 溢出了

谢谢你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 18:14:13 | 显示全部楼层

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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