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
会导致精度损失)。
我正在使用 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
会导致精度损失)。