首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在用C执行算术之后,我会丢失一个值的其余部分?

为什么在用C执行算术之后,我会丢失一个值的其余部分?
EN

Stack Overflow用户
提问于 2015-05-06 14:36:01
回答 1查看 128关注 0票数 3

我正试图通过遵循一个教科书来学习基本C编程,而且我肯定遗漏了一些关于数据类型、舍入和/或操作顺序的东西,因为当我试图构建一个简单的程序来将秒转换为小时和分钟时,时间是工作的,而其余的分钟则是0,而它们不应该工作。

感谢古瑟拉,我知道这样的程序存在巨大的安全漏洞,但为了学习目的,我将要求您忽略安全性。目前,这些书希望我坚持使用printfscanfwhile循环,因为它们与我正在阅读的教科书的章节相对应(这些书让我知道,当我再读几章的时候,我就会开始担心安全性)。

我的C程序如下所示:

代码语言:javascript
运行
复制
/* Ask the user for a number of seconds, convert to X hours and Y minutes */
/* Continue doing this with a while loop until user enters 0 */
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main(void)
{
    const int minperhour = 60;
    const int secpermin  = 60;
    int sec, hr;
    float min;
    sec = 1;
    while(sec != 0)
    {
        printf("Enter the number of seconds to convert: \n");
        scanf("%i", &sec);
        min = sec/secpermin;
        hr  = min/minperhour;
        min = (sec/secpermin) - (hr * minperhour);
        printf("%d hours and %f minutes \n", hr, min);
    }

    return 0;
}

我希望能够输入3601,结果是:

1 hours and 0.01667 minutes

因为这是在R语言中计算表达式的方式,我对此比较熟悉:

代码语言:javascript
运行
复制
> min = 3601/60
> min
[1] 60.02
> hr = min/60
> hr
[1] 1
> min = (3601/60) - (1 * 60)
> min
[1] 0.01667

然而,我在C中得到的是:

代码语言:javascript
运行
复制
C:\Users\hackr>pa2q3.exe
Enter the number of seconds to convert:
3601
1 hours and 0.000000 minutes
Enter the number of seconds to convert:
7205
2 hours and 0.000000 minutes
Enter the number of seconds to convert:
0
0 hours and 0.000000 minutes

C:\Users\hackr>

我投了7205的第二次尝试只是为了好的措施。

我有一种感觉,在堆栈溢出的一些你C大师可以使用更先进的技术,以更简洁的形式编写程序的安全版本。这可能也是教育,如果你想提到它,但首先,我需要了解发生了什么与这个简单的程序。

EN

Stack Overflow用户

回答已采纳

发布于 2015-05-06 14:38:24

整数除法:除以两个整数后的整数值以浮点格式存储。例:

代码语言:javascript
运行
复制
 float a = 3/5;

在这里,35之间将发生整数除法,从而导致0。现在,如果您尝试将这个0存储在一个float变量中,它将被存储为0.00

代码语言:javascript
运行
复制
    min = sec/secpermin;

应该是

代码语言:javascript
运行
复制
    min = (float)sec/secpermin;

代码语言:javascript
运行
复制
    min = sec/(float)secpermin;

或者,正如@alk所指出的,您也可以这样做:

代码语言:javascript
运行
复制
    min = sec;     
    min /= secpermin;    // min=min/secpermin;   here, typecasting is not required as 
                        // numerator (min) is already float.

或者,您可以将它们全部设置为float,并将它们打印为int

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30079850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档