FormatDateTime - целочисленная арифметика c переполнение C ++ - PullRequest
1 голос
/ 14 февраля 2020

Я использую функцию 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 переполнение

Есть ли какое-либо решение, чтобы избежать этой проблемы?

1 Ответ

1 голос
/ 14 февраля 2020

Хотя некоторые компиляторы интерпретируют константу 0x100000000 как 64-разрядное целое число, кажется, что ваше - нет, что делает его слишком большим, чтобы поместиться в 32-разрядное целое число (отсюда и предупреждение).

Простой способ обойти это - заменить целочисленную константу значением double:

FloatingDate += 4294967296.0;

В качестве альтернативы (если ваш компилятор это поддерживает) вы можете добавить суффикс uLL к целочисленной константе:

FloatingDate += 0x100000000uLL;

Но это может вызвать другое предупреждение (преобразование из unsigned long long в double может привести к потере точности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...