Вызовите целочисленное переполнение PHP

Вы можете сделать это с помощью getattr:

def my_func(df, pandas_stat):
    for col in df.columns:
        print(getattr(df[col], pandas_stat)())  # the empty parenthesis
                                                       # are required to call
                                                       # the method

df_max = my_func(df, "max")
8
задан Kris Erickson 19 November 2008 в 02:26
поделиться

6 ответов

Таким образом, я решил проблему и обнаружил много о PHP (по крайней мере, в способе, которым это обрабатывает Целочисленное переполнение).

1) Это полностью зависело от пересечения, на какой платформе машина работала, какая версия PHP, имело ли это Suhosin Укрепленное выполнение PHP, и сколько битов это было скомпилировано для (32 или 64). 6 машин вели себя способ, которым я ожидал (который был на самом деле неправильным, по крайней мере, неправильно согласно их документации), и 3 машины вели себя способом, я все еще не могу объяснить, и 3 машины вели себя согласно тому, что команда intval говорит, что делает в документации.

2) Intval, как предполагается, возвращает PHP_INT_MAX, когда интервал> PHP_INT_MAX (не интервал и 0xffffffff), но это только происходит на некоторых версиях PHP4 и PHP5. Различные версии PHP возвращают различные значения когда интервал> PHP_INT_MAX.

3) Следующий код может возвратить 3 различных результата (см. 1):

<?php
echo "Php max int: ".PHP_INT_MAX."\n";
echo "The Val: ".(-1580033017 + -2072974554)."\n";
echo "Intval of the val: ".intval(-3653007571)."\n";
echo "And 0xffffffff of the val: ".(-3653007571 & 0xffffffff)."\n";
?>

Это может возвратиться (который, кажется, является правильным для Intval, но неправильным при и 0xffffff),

Php max int: 2147483647
The Val: -3653007571
Intval of the val: -2147483648
And of the val: -2147483648

И это может возвратиться (который противоречит документации PHP для intval):

Php max int: 2147483647
The Val: -3653007571
Intval of the val: -641959725
And of the val: -641959725

И на машинах на 64 бита это возвращается (который корректен):

Php max int: 2147483647
The Val: -3653007571
Intval of the val: -3653007571
And of the val: -641959725

Решение

Во всяком случае мне было нужно решение, которое будет работать над всеми этими платформами и не зависеть от причуд конкретной версии PHP, скомпилированного с конкретным интервалом Max Таким образом я бегунок со следующей перекрестной-PHP функцией thirtyTwoBitIntval:

function thirtyTwoBitIntval($value)
{
    if ($value < -2147483648)
    {
        return -(-($value) & 0xffffffff);
    }
    elseif ($value > 2147483647)
    {
        return ($value & 0xffffffff);
    }
    return $value;
}

Комментарий

Я действительно думаю, что разработчики PHP должны были сказать, что Интервал является Интервалом на 32 бита, неважно, работает ли он на 32 или машине на 64 или 128 битов (как DotNet CLR, например), и не сделал случайным образом upconvert этого к плаванию в зависимости от числа Битов, под которыми PHP является компилятором.

14
ответ дан 5 December 2019 в 05:13
поделиться

Внутренне, PHP использует "целочисленный" тип для большинства чисел. Однако они только идут до сих пор: если Вы добавите большое целое число к большому целому числу, то PHP будет видеть, что результат является слишком большим для вписывания в нормальное целое число и присвоит его числу с плавающей запятой. Числа с плавающей запятой сами (плавания) только идут настолько высоко, однако, и существует точка вокруг шестнадцатиразрядной метки, где PHP просто потеряет график полностью.

Существует опция использовать математику произвольной точности, которая поддерживает числа любого размера и точности, представленной как строки. Посмотрите больше здесь: http://us2.php.net/bc

3
ответ дан 5 December 2019 в 05:13
поделиться

Это будет работать?

echo (-1580033017 + -2072974554) & 0xffffffff

Для обобщения Вы могли сделать (простите любые синтаксические ошибки, я не касался PHP в течение долгого времени):

function s32add($a, $b) {
    return ($a + $b) & 0xffffffff;
}
2
ответ дан 5 December 2019 в 05:13
поделиться

Я думаю, что это может иметь отношение к целому числу в PHP быть неподписанными 32 битами как в C#, они подписываются 32 бита по умолчанию.

Вы играете с числами на краю нормального диапазона на 31-32 бита.

См. дополнительную документацию в руководстве PHP:

http://www.php.net/manual/en/language.types.integer.php

Размер целого числа зависим от платформы, хотя максимальное значение приблизительно двух миллиардов является обычным значением (это составляет подписанные 32 бита). PHP не поддерживает целые числа без знака. Целочисленный размер может быть определен с помощью постоянного PHP_INT_SIZE и максимального значения с помощью постоянного PHP_INT_MAX начиная с PHP 4.4.0 и PHP 5.0.5.

2
ответ дан 5 December 2019 в 05:13
поделиться

Проверьте свой номер версии PHP - я полагаю, что возможно, что Вы получите различные результаты с различными версиями PHP, который может иметь отличающуюся поддержку длинных целых. Я полагаю, что была ошибка с длинными целыми в наконец одном из PHP 5 версий.

В версии PHP 5.2.0 - ответ является ТОЧНО тем же, когда Вы вошли в C#

1617621783,

при использовании точной функции Вы имеете выше.

Можно использовать phpinfo () команда для нахождения номера версии, легко.

$x1 = -1580033017; 
$x2 = -2072974554; 
$x3 = -1170476976 ; 
$x4 = -1007518822;
echo f($x1, $x2, $x3, $x4);

function f($x1, $x2, $x3, $x4)
{
   return intval(intval(intval($x1 + $x2) ^ $x3) + $x4);
}
1
ответ дан 5 December 2019 в 05:13
поделиться

Если вы хотите иметь 100% рабочее решение для 32-битного intval как на 32-битной, так и на 64-битной платформах, то я предлагаю вам использовать следующее решение:

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}
11
ответ дан 5 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: