-Woverflow catn cout值

时间:2017-06-24 02:37:44

标签: c++ overflow

我刚刚开始编程,我编写了以下代码,但由于某种原因,即使我几乎确定我的方式过度使用了值类型,它也没有显示正确的值。

#include <limits>
#include <iostream>

int main() {
    unsigned long long int imin = std::numeric_limits<unsigned long long int>::min(); // minimum value
    unsigned long long int imax = std::numeric_limits<unsigned long long int>::max(); // maximum value

    std::cout << imin << " " << imax << std::endl;

    unsigned long long int a;
    a = 45*44*43*42*41*40;
    std::cout << "die wahrscheinlichkeit ist: 1:"  << a << std::endl;
    return 0;
}

当我编译它时,我得到了这个:

  

0 18446744073709551615
  die wahrscheinlichkeit ist:1:1569475904

     

处理完成,退出代码为0

和这个警告:

  

Warnung:Ausdruck的Ganzzahlüberlauf[-Woverflow]
       a = 45 * 44 * 43 * 42 * 41 * 40;

翻译,这意味着表达式中的整数溢出(或类似的东西)。

当我使用普通计算器时,我得到5864443200。

我正在使用C ++ 14。

1 个答案:

答案 0 :(得分:0)

问题确实是你的正常int数字有溢出。除了计算之外,您的声明都很好。数字40,41,42,43,44和45是具有各自长度的正常整数。它们乘以正常整数,当数字变大时,溢出发生。计算完成后(溢出已经发生),数字将转换为unsigned long long int。

因此,使用LLU后缀制作 long long unsigned 类型的数字:

$dueDate = '2017-06-26 09:11:28';

$due = DateTime::createFromFormat('Y-m-d H:i:s', $dueDate);
$today = new DateTime();

$diff = $today->diff($due);

echo $diff->format('%hh %im');

这将解决您的问题。