Сдвиг влево PHP, дающий два ответа на двух различных машинах

Я очень смущен поведением функции сдвига влево PHP. Я использую его на двух различных машинах (dev и размещаю), и они дают мне различные ответы. Я разыскал его к этому вычислению:

(-3941404251) << 5;

На одной машине я получаю ответ-1570884448; на другом я добираюсь 0. В обеих системах, PHP_INT_MAX = 2147483647. Позже 32-разрядная система и первое 64-разрядное, хотя php работает как процесс на 32 бита и все еще дает тот же ответ.

Я могу только предположить, что это - проблема с 32-разрядным по сравнению с 64-разрядным, но является там любым простым способом получить желаемое поведение. Если бы кто-то мог бы указать на меня на функцию или что-то, которое было бы большим.

Спасибо!

5
задан Brendon 21 February 2010 в 12:54
поделиться

3 ответа

Первое значение - правильный ответ для вашей проблемы. В официальном руководстве сказано, что вы не можете использовать побитовый оператор для чисел, превышающих max_int. Поэтому попробуйте использовать функции GMP (например, http://www.php.net/manual/en/function.gmp-and.php) и рассматривать число как строку.

2
ответ дан 15 December 2019 в 00:59
поделиться

На компьютерах установлена ​​одна и та же версия PHP? (-3941404251) уже слишком велик для 32-битного значения со знаком, поэтому я подозреваю, что «правильный» результат не определен, и разные версии / компиляции / и т. Д., Дающие разные результаты, не будут считаться ошибкой.

1
ответ дан 15 December 2019 в 00:59
поделиться

Изменение раскладки клавиатуры - плохая идея, так как это (возможно) повысило бы скорость набора текста на одной клавиатуре, но серьезно повредило бы скорость набора текста на других клавиатурах или на компьютерах, где нет специальной раскладки клавиатуры. Я обнаружил, что часто лучше приспособиться к настройкам по умолчанию, чтобы изменить их везде. (Лично мои пальцы сильно смещены от Эмака, что вызывает большое трение при наборе текста во всем мире.)

-121--833494-

Хорошо, я провел несколько дней в сорняках с этим, и я думаю, что у меня есть ручка.

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

Элемент управления Silverlight Datapager имеет свойство ItemCount. Он доступен только для чтения и не может использоваться в XAML или устанавливаться непосредственно в коде. Однако если элемент управления пользователя, содержащий пейджер, имеет DataContext, реализующий IPagedCollireView, то объект контекста данных должен реализовать свойство ItemCount с уведомлением PropertyChanged, и DataPager, по-видимому, получает это автоматически.

Во-вторых, я настоятельно рекомендую Брэду Абрамсу превосходную серию записей в блогах на RIA Services , особенно на ViewModel . В нем содержится большая часть того, что необходимо для работы пейджинга и фильтрации, хотя в нем отсутствует критическая часть управления количеством предметов. Его загружаемый образец также содержит очень хорошую базовую структуру для реализации ModelViewViewModel (MVVM). Спасибо, Штифтик!

Так вот как сделать подсчет предметов работать. (Этот код относится к пользовательскому ORM, в то время как код Штифтика использует Рамка;

Во-первых, система ORM должна поддерживать подсчет записей с фильтром и без него. Вот мой код доменной службы, который делает счетчики доступными для RIA Services:

[Invoke]
public int GetExamCount()
{
    return Context.Exams.Count();
}

[Invoke]
public int GetFilteredExamCount(string descriptionFilter)
{
    return Context.Exams.GetFilteredCount(descriptionFilter);
}

Обратите внимание на атрибут [Invoke]. Это необходимо для любого метода StartService, который не возвращает сущность или коллекцию сущностей.

Теперь для кода ViewModel. Конечно, вам нужен ItemCount.

    int itemCount;
    public int ItemCount
    {
        get { return itemCount; }
        set
        {
            if (itemCount != value)
            {
                itemCount = value;
                RaisePropertyChanged(ItemCountChangedEventArgs);
            }
        }
    }

Метод LoadData выполнит запрос для получения текущего набора строк для дисплея в DataGrid. (Это еще не реализует пользовательскую сортировку, но это простое дополнение.)

    EntityQuery<ExamEntity> query = 
        DomainContext.GetPagedExamsQuery(PageSize * PageIndex, PageSize, DescriptionFilterText);
    DomainContext.Load(query, OnExamsLoaded, null);

Затем метод обратного вызова запускает запрос для получения счетчиков. Если фильтр не используется, мы получаем счетчик для всех строк; если есть фильтр, то мы получаем подсчет для отфильтрованных строк.

private void OnExamsLoaded(LoadOperation<ExamEntity> loadOperation)
{
    if (loadOperation.Error != null)
    {
        //raise an event... 
        ErrorRaising(this, new ErrorEventArgs(loadOperation.Error));
    }
    else
    {
        Exams.MoveCurrentToFirst();
        if (string.IsNullOrEmpty(DescriptionFilterText))
        {
            DomainContext.GetExamCount(OnCountCompleted, null);
        }
        else
        {
            DomainContext.GetFilteredExamCount(DescriptionFilterText, OnCountCompleted, null);
        }
        IsLoading = false;
    }
}

Существует также метод обратного вызова для счетчиков:

void OnCountCompleted(InvokeOperation<int> op)
{
    ItemCount = op.Value;
    TotalItemCount = op.Value;
}

С помощью набора ItemCount элемент управления Datapager перехватывает его,и у нас есть пейджинг с фильтрацией и смарт-запрос, который возвращает только отображаемые записи!

LINQ упрощает запрос с помощью .Skip () и .Take (). Делать это с сырой ADO.NET труднее. Я научился делать это, разбирая запрос, созданный LINQ.

SELECT * FROM 
    (select ROW_NUMBER() OVER (ORDER BY Description) as rownum, * 
     FROM Exams as T0  WHERE T0.Description LIKE @description ) as T1 
WHERE T1.rownum between @first AND @last ORDER BY rownum

Предложение «select ROW_NUMBER () OVER (ORDER BY Description) as rownum» является интересной частью, поскольку «OVER» используется ещё не многими. Это предложение сортирует таблицу в разделе Описание перед назначением номеров строк, и фильтр также применяется перед назначением номеров строк. Это позволяет внешней функции SELECT выполнять фильтрацию по номерам строк после сортировки и фильтрации.

Итак, это, умное пейджинг с фильтрацией, в RIA Services и Silverlight!

-121--2711725-

Для преодоления целочисленных ограничений можно использовать функции Математика BC . Это альтернатива ответу функции elq GMP и, вероятно, лучше поддерживается.

1
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

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