鱼C论坛

 找回密码
 立即注册
查看: 1498|回复: 6

[已解决]新人求助,关于舍罕王的问题

[复制链接]
发表于 2017-7-10 22:43:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 1762075716 于 2017-7-10 22:43 编辑

我写的代码如下
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.         int i;
  6.         unsigned long long sum = 0,temp,weight;
  7.        
  8.         for(i = 0;i < 64; i++){
  9.                 temp = pow(2,i);
  10.                 sum = sum + temp;
  11.         }
  12.        
  13.         weight = sum / 25000;
  14.        
  15.         printf("舍罕王应该给予达依尔%llu粒麦子!\n",sum);
  16.         printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子\n",weight);
  17.        
  18.         return 0;
  19. }
复制代码

但是编译时却有这样一堆warning
QQ截图20170710221846.jpg
但是打印出来的结果和小甲鱼的结果是一样的,请问这是怎么回事呢
最佳答案
2017-7-11 10:03:41
本帖最后由 超凡天赐 于 2017-7-11 10:09 编辑

我认为这是国际标准的问题,你用的是vc6.0++,98年的软件,怎么可能去支持一个99年的标准。long long型在99标准中才出现。要想知道,请查看99国际标准的Annex F (normative) IEC 60559 floating-point arithmetic,在§6.4.4.1  Language  63页面(国际标准页码我不知道它是什么逻辑 )。这里我把图片放上来: 屏幕快照 2017-07-11 上午9.51.23.png 屏幕快照 2017-07-11 上午9.44.52.png

至于你为什么能打印出来,你看看你打印出来的是什么?你直接打印出%llu,并不是数字,而且警告里说了
warning: too many arguments for format


什么意思?说明你的形参要比格式化符号要多。编译器识别不了,如果想要识别,你可以用一用vs2017,那个对c11支持的比较好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-10 22:52:59 | 显示全部楼层
注意里面类型的定义,无符号长整形64位不同的编译器可能不同;还有就是用temp =  pow(2,i); 这里,要先转换成无符号长整形然后在赋值给temp

下面是vc++6.0的
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.         int i;
  6.        unsigned __int64 sum = 0,temp,weight;
  7.         
  8.         for(i = 0;i < 64; i++){
  9.                 temp =  (unsigned __int64)pow(2,i);
  10.                 sum = sum + temp;
  11.         }
  12.         
  13.         weight = sum / 25000;
  14.         
  15.         printf("舍罕王应该给予达依尔%llu粒麦子!\n",sum);
  16.         printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子\n",weight);
  17.         
  18.         return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 23:01:10 | 显示全部楼层
有些编译器不支持 %ll 宽度限制……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2017-7-10 23:04:07 | 显示全部楼层
小甲鱼 发表于 2017-7-10 23:01
有些编译器不支持 %ll 宽度限制……

那为什么还可以正常打印呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-11 10:03:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 超凡天赐 于 2017-7-11 10:09 编辑

我认为这是国际标准的问题,你用的是vc6.0++,98年的软件,怎么可能去支持一个99年的标准。long long型在99标准中才出现。要想知道,请查看99国际标准的Annex F (normative) IEC 60559 floating-point arithmetic,在§6.4.4.1  Language  63页面(国际标准页码我不知道它是什么逻辑 )。这里我把图片放上来: 屏幕快照 2017-07-11 上午9.51.23.png 屏幕快照 2017-07-11 上午9.44.52.png

至于你为什么能打印出来,你看看你打印出来的是什么?你直接打印出%llu,并不是数字,而且警告里说了
warning: too many arguments for format


什么意思?说明你的形参要比格式化符号要多。编译器识别不了,如果想要识别,你可以用一用vs2017,那个对c11支持的比较好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-11 10:07:37 | 显示全部楼层
小甲鱼 发表于 2017-7-10 23:01
有些编译器不支持 %ll 宽度限制……

98年的软件怎么可能去支持99年的标准
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-11 11:06:07 | 显示全部楼层
超凡天赐 发表于 2017-7-11 10:07
98年的软件怎么可能去支持99年的标准

必须点个赞,回答这么详细!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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