FormatDateTime-整数算术溢出C++; 我使用C++ Builder函数,它允许我从我的微控制器接收的时间格式如下: 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); }

FormatDateTime-整数算术溢出C++; 我使用C++ Builder函数,它允许我从我的微控制器接收的时间格式如下: 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); },c++,datetime,integer-overflow,C++,Datetime,Integer Overflow,使用此代码,我得到以下警告: 整数算术溢出 有什么办法可以避免这个问题吗 尽管有些编译器会将常量0x100000000解释为64位整数,但您的编译器似乎不会解释为64位整数,这使得它太大,无法放入32位整数(因此出现警告) 解决此问题的一种简单方法是将整数常量替换为double值: FloatingDate+=4294967296.0; 或者(如果编译器支持),可以将uLL后缀添加到整数常量: FloatingDate+=0x100000000整; 但这可能会导致不同的警告(从无符号长-长转

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

整数算术溢出


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

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

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

FloatingDate+=4294967296.0;
或者(如果编译器支持),可以将
uLL
后缀添加到整数常量:

FloatingDate+=0x100000000整;

但这可能会导致不同的警告(从
无符号长-长
转换为
可能会导致精度损失)。

请不要建议使用双常量初始化长值!关于
long val=8070450532247928831.0
val
将接收比预期值多1的值8070450532247928832!双尾数只有48位长,而长尾数最多可以有63位(如果无符号,则为64位)有效位,这导致了不准确。谢谢你的回答,你的意思是我用4294967296.0重新计算了
0x100000000
?@SergeBallesta没有长值被初始化-
FloatingDate
是一个
双精度
,代码向它添加了一个
double
常量。@geek-是的,就是它。@Serge,取决于OP系统上的
long
是32位还是64位:“long-long”更可能是64位。您的评论谈到了2038问题,但在处理Unix 0纪元1970时会出现这种情况。这与变量名不匹配。你确定你的数学都正确吗?