Как я могу правильно обрабатывать большие отрицательные числа со сдвигом битов? - PullRequest
0 голосов
/ 02 марта 2020

Я использую эту php библиотеку для чтения в документе Excel. По большей части это работает нормально, но если я введу большое отрицательное число длиной более 4 цифр, следующий бит кода больше не вернет правильный результат. Мне немного неясно, как обрабатывать знак с помощью побитовых операций для корректировки кода. Проблема находится в строке 4, когда первый If оценивается как true:

    function _GetIEEE754($rknum) {
    if (($rknum & 0x02) != 0) {
           // this code seems to fail once you get below -9999 to 5 digit negative numbers
            $value = $rknum >> 2;
    } else {
        //mmp
        // I got my info on IEEE754 encoding from
        // http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
        // The RK format calls for using only the most significant 30 bits of the
        // 64 bit floating point value. The other 34 bits are assumed to be 0
        // So, we use the upper 30 bits of $rknum as follows...
        $sign = ($rknum & 0x80000000) >> 31;
        $exp = ($rknum & 0x7ff00000) >> 20;
        $mantissa = (0x100000 | ($rknum & 0x000ffffc));
        $value = $mantissa / pow( 2 , (20- ($exp - 1023)));
        if ($sign) {
            $value = -1 * $value;
        }
        //end of changes by mmp
    }
    if (($rknum & 0x01) != 0) {
        $value /= 100;
    }
    return $value;
}

Как я могу изменить битовый сдвиг, чтобы должным образом учитывать знак для больших чисел? Вот тестовые примеры того, как это должно работать:

Рабочий тестовый пример:

Значение в Excel: -1454.22 (читается как тип mulrk «3238117489»)

_GetIEEE754 (3238117489)

Возвращает: -1454.22

Сбой теста:

Значение в Excel: -12345.03 (читается как введите mulrk «4290029287»)

_GetIEEE754 (4290029287)

Возвращает: 10725073.21

Должен вернуть: -12345.03

Я знаю, что есть другие новее библиотеки для импорта файлов Excel, но этот очень интегрирован в устаревший проект, и я надеюсь избежать такого рефакторинга, если это вообще возможно.

...