FormatDateTime - 整数算术溢出 C++

FormatDateTime - Integer arithmetic overflow C++

我正在使用 C++ 构建器函数,它允许我格式化从我的微控制器接收到的时间,如下所示:

void DisplayTime(unsigned long SecondsSince1900, unsigned short FractionOfSecond, AnsiString* DecodedString)
{
    TDateTime WindowsDate;
    double FloatingDate;
    FloatingDate = SecondsSince1900 + (FractionOfSecond / 65536.0);

    if ( (SecondsSince1900 & 0x80000000) == 0 )
    {// Seconds since wraps around during year 2036.
     // When the top bit is clear we assume that the date is after 2036         rather than before 1968.
        FloatingDate += 0x100000000;//this line is the cause of the warning
    }

    FloatingDate /= SECONDS_IN_DAY ;
    WindowsDate = FloatingDate ;
    *DecodedString = FormatDateTime(" yyyy/mm/dd hh:mm:ss ", WindowsDate);
}

使用此代码我收到以下警告:

Integer arithmetic overflow

有什么办法可以避免这个问题吗?

虽然一些编译器会将常量 0x100000000 解释为 64 位整数,但您的编译器似乎不是 - 这使得它太大而无法放入 32 位整数(因此出现警告)。

解决此问题的一个简单方法是用 double 值替换整数常量:

FloatingDate += 4294967296.0;

或者(如果您的编译器支持)您可以将 uLL 后缀添加到整数常量:

FloatingDate += 0x100000000uLL;

但这可能会导致不同的警告(从 unsigned long long 转换为 double 会导致精度损失)。