每当我输入65岁或以下的年龄时,我得到的数字都会小于210万。但是,当我输入68岁或更高的年龄时,结果立即变为18,446,744,071,590,568,320,这是uint64_t的最大值。我不知道为什么会有这样的结果。它一直运行良好,直到大约2,100,000。

// How many seconds have I lived?
#include <stdio.h>
#include <string>
#include <cstdint>
using namespace std;
string addCommas(uint64_t answer);
int main ()
{
    int seconds = 60, minutes = 60, hours = 24, days = 365;
    int years; uint64_t secondsLived, secondsAwake;
    printf("How many years have you lived? ");
    scanf("%d",&years);
    secondsLived = seconds*minutes*hours*days*years;
    secondsAwake = (float)secondsLived*0.666;

    printf("\nYou have existed for %s seconds\n",addCommas(secondsLived).c_str());
    printf("You have been awake for %s seconds\n",addCommas(secondsAwake).c_str());
}
string addCommas(uint64_t answer){
    string num = to_string(answer);
    int insertplace = (int)num.length() - 3;
    while (insertplace > 0) {
        num.insert(insertplace, ",");
        insertplace-=3;
    }
    return num;
}


这是几个输出:

How many years have you lived? 67

You have existed for 2,112,912,000 seconds
You have been awake for 1,407,199,392 seconds


How many years have you lived? 69

You have existed for 18,446,744,071,590,568,320 seconds
You have been awake for 12,285,531,553,090,562,048 seconds

最佳答案

在这一行:

secondsLived = seconds*minutes*hours*days*years;


您将多个int相乘,然后将结果分配给uint_64int上的计算溢出。

将至少一个值转换为uint_64,然后再将它们相乘,以便对uint_64值进行计算:

secondsLived = (uint_64)seconds*minutes*hours*days*years;

关于c++ - uint64_t错误地达到了18,446,744,071,590,568,320,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24194148/

10-11 18:55