1762075716 发表于 2017-7-10 22:43:27

新人求助,关于舍罕王的问题

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

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

int main()
{
        int i;
        unsigned long long sum = 0,temp,weight;
       
        for(i = 0;i < 64; i++){
                temp = pow(2,i);
                sum = sum + temp;
        }
       
        weight = sum / 25000;
       
        printf("舍罕王应该给予达依尔%llu粒麦子!\n",sum);
        printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子\n",weight);
       
        return 0;
}
但是编译时却有这样一堆warning

但是打印出来的结果和小甲鱼的结果是一样的,请问这是怎么回事呢

ba21 发表于 2017-7-10 22:52:59

注意里面类型的定义,无符号长整形64位不同的编译器可能不同;还有就是用temp =pow(2,i); 这里,要先转换成无符号长整形然后在赋值给temp

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

int main()
{
      int i;
       unsigned __int64 sum = 0,temp,weight;
      
      for(i = 0;i < 64; i++){
                temp =(unsigned __int64)pow(2,i);
                sum = sum + temp;
      }
      
      weight = sum / 25000;
      
      printf("舍罕王应该给予达依尔%llu粒麦子!\n",sum);
      printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子\n",weight);
      
      return 0;
}

小甲鱼 发表于 2017-7-10 23:01:10

有些编译器不支持 %ll 宽度限制……{:10_266:}

1762075716 发表于 2017-7-10 23:04:07

小甲鱼 发表于 2017-7-10 23:01
有些编译器不支持 %ll 宽度限制……

那为什么还可以正常打印呢{:10_257:}

超凡天赐 发表于 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.1Language63页面(国际标准页码我不知道它是什么逻辑{:10_247:} )。这里我把图片放上来:。

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

什么意思?说明你的形参要比格式化符号要多。编译器识别不了,如果想要识别,你可以用一用vs2017,那个对c11支持的比较好。

超凡天赐 发表于 2017-7-11 10:07:37

小甲鱼 发表于 2017-7-10 23:01
有些编译器不支持 %ll 宽度限制……

98年的软件怎么可能去支持99年的标准{:10_247:}

小甲鱼 发表于 2017-7-11 11:06:07

超凡天赐 发表于 2017-7-11 10:07
98年的软件怎么可能去支持99年的标准

{:5_106:} 必须点个赞,回答这么详细!
页: [1]
查看完整版本: 新人求助,关于舍罕王的问题