鱼C论坛

 找回密码
 立即注册
查看: 1971|回复: 5

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

[复制链接]
发表于 2021-8-10 23:15:56 | 显示全部楼层 |阅读模式

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

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

x
麻烦大佬解答啦:

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


pow函数:舍罕王的失算.jpg
最佳答案
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 ,也是首字母
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 ,也是首字母
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-8-13 17:01:17 | 显示全部楼层
谢谢老兄。才刚接触编程,C语言学到第6课,这是跟着课后作业抄来练手的不是基础不牢固,而是堪称还没什么基础

想多问一句,我上面帖子中的问题2是怎么回事呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

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

使用道具 举报

发表于 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 的数值,就会导致溢出现象。字符型变量也是一样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-6 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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