张sir. 发表于 2021-8-10 23:15:56

pow 函数:舍罕王的失算-代码问题-C语言第6课作业

麻烦大佬解答啦:

问题1:下面上部分是我的代码,下半部分是模板代码(下图左边是我的代码,和右边模板代码基本一模一样--截图可能显示不出来),但为什么打印结果不同呢?

问题2:既然d表示有符号十进制数,那为什么早期几次课中%d的表示的是大于0的正整数呢?而在学习有符号无符号数之后则需换成%u。还是说只有当代码中事先声明了有符号无符号,才在后续printf中加以区分,否则不区分直接用%d也可以?

问题3:在【printf("舍罕王应该给予达依尔%11u粒麦子!\n", sum);】这个代码中,为什么提前设置数据宽度为11,我在写代码时虽然知道数字很大,但很多时候也不知道其宽度究竟有多大啊。

#include <stdio.h>
#include <math.h>

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;
        }
        weight = sum / 25000;
       
        printf("舍罕王应该给予达依尔%11u粒麦子!\n", sum);
        printf("如果每25000粒麦子为1kg,那么应该给%11u公斤麦子!\n", weight);
       
        return 0;
}


#include <stdio.h>
#include <math.h>

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;
      }

      weight = sum / 25000;

      printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
      printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);

      return 0;
}


超过光速c 发表于 2021-8-11 06:32:50

。。。。字体的问题,他的代码
printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
      printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);
u前面是两个 LL 小写的,你给看成了两个11,害。
基础不太牢固哦,建议淘本C语言的书在身边没事儿翻翻最好。
因为你定义的是 unsigned long long 所以,格式符组合就应该为:%llu,你直接记为首字母
再比如,你定义的是long(long int等价)长整型,格式符组合就应该为: %ld ,也是首字母

张sir. 发表于 2021-8-13 17:01:17

谢谢老兄。才刚接触编程,C语言学到第6课,这是跟着课后作业抄来练手的{:10_266:}不是基础不牢固,而是堪称还没什么基础{:10_266:}

想多问一句,我上面帖子中的问题2是怎么回事呢?

超过光速c 发表于 2021-8-13 17:36:25

问题2看漏了,如果详细给你解释清楚篇幅会很长的。我简短描述一下。
%d,%u,这叫格式化符,在输出时对于不同类型的数据要使用不同的格式化符。这就引出了数据类型的问题。
整型 int,无符号整型 unsigned int,还可以排列组合很多种出来,长整形 long int,无符号短整型 unsigned short (int) ....
如果输入的数值过大,超过了数据类型的范围,这就会涉及到数据溢出的问题,溢出了会造成很多无法预测到的麻烦。代码需要有健壮的特性。
还是那个建议,视频便于快速上手敲代码,具备了快这个属性,显然会存在不全,不够系统。备本书在手边吧,就某些大学的知名教材C语言入门书很好用的。

张sir. 发表于 2021-8-13 17:43:58

超过光速c 发表于 2021-8-13 17:36
问题2看漏了,如果详细给你解释清楚篇幅会很长的。我简短描述一下。
%d,%u,这叫格式化符,在输出时对于 ...

感谢老兄,应该是要弄本书的,现在考虑到是谭浩强C语言或者直接是甲鱼老师视频课程配套书籍。

你上面说的这些很详细的,在甲鱼老师视频中C语言第6课《数据类型》中也有讲到,不过我的问题2其实还没有得到解答哈——之前正整数的赋值都是%d,现在怎么就需要用%u了?还是说——除非前面代码声明了有符号无符号,才需要区分u,d;如果前面代码没声明有无符号,则不需要区分;还是说——当数值很大时,即便没有区分有无符号,也需要用%u。

超过光速c 发表于 2021-8-13 20:46:36

张sir. 发表于 2021-8-13 17:43
感谢老兄,应该是要弄本书的,现在考虑到是谭浩强C语言或者直接是甲鱼老师视频课程配套书籍。

你上面 ...

需要定义为 有符号位(默认)或无符号位的数据类型
如果你定义了整数型 int 数据,默认为有符号整型,把整型的定义写完整就是 (signed) int,输出时格式化符 就用%d
如果你定义的是无符号整型数据 unsigned int,输出时格式化符就用%u
都是与你定义的数据类型相对应的,你定义的什么数据类型,就用对应的格式化符就行了,直接记住就行了,没有什么逻辑。
char型你输出时需要用到的格式化符就是%c。
所以,具体用什么格式化符,以你定义的数据类型为准

当你数值需要很大时,超出了你定义的数据类型的范围,就是我上面说的,数据会溢出,溢出了就会出现意想不到的问题。
如果,你定义了一个基本整型 int a ,用函数 sizeof(a) 对a所占的内存进行度量,是4个字节(编译器之间会有差异,有的系统中是2个字节,所以我在这里提到你可以直接用sizeof函数直接度量就知道了),也就是32位(一个字节等于8位),是一个很大的数值了,即我这个基本整型 int a 可以容纳最大的数值应该是2的32次方-1,如果我对 a 存入一个 2的32次方-1+1 的数值,就会导致溢出现象。字符型变量也是一样的。
页: [1]
查看完整版本: pow 函数:舍罕王的失算-代码问题-C语言第6课作业