“Глюки” на 32 - 64 бита в PHP

Вы можете использовать find оператор javascript, чтобы получить нужную строку из arrResult. Измените ваш код, как показано ниже:

for(const key of unique) {
  let result = arr.filter(x => {
    return x.name === key;
  });
  var currResult = arrResult.find(x => x.name == key);
  output.push({
    name: key,
    // need to get the rest of the properties here
    total: currResult.total,
    featured: currResult.featured,
    noAnswers: currResult.noAnswers
  });
}

JSFiddle: https://jsfiddle.net/ashhaq12345 / z8royg5w /

5
задан skaffman 17 March 2012 в 11:56
поделиться

5 ответов

Это - высокоуровневый язык, таким образом, что-либо не укусило связанный (побитовые операторы, сдвиг разряда) будет то же.

6
ответ дан 18 December 2019 в 12:02
поделиться

Целое число может составить 64 бита вместо 32 битов. Существуют некоторые причудливые случаи, где это может вызвать проблемы.

4
ответ дан 18 December 2019 в 12:02
поделиться

Результаты деления с плавающей точкой будут затронуты увеличением к 64 битам; таким образом, если у Вас есть код, который делает что-то глупое как сравнение результатов деления с плавающей точкой к hardcoded константам, ожидает, что это повредится.

0
ответ дан 18 December 2019 в 12:02
поделиться

Единственная проблема, с которой вы столкнетесь, - это когда вы полагались на 32-битное двоичное представление данных. В основном потому, что PHP использует целые числа со знаком, вы увидите проблемы с хешированием, генерацией ключей и т.д. при явном преобразовании в int с (int), числа> 2 ^ 32 будут переноситься туда, где они не будут переноситься в 64-битную среду если, конечно, они не> 2 ^ 64.

Пример 4 vs 8:

Проблемы с десятичным значением:

     0010 >> 1 =      0001   [ 1 dec ]
0000 0010 >> 1 = 0000 0001   [ 1 dec ]

Они оба дают одинаковый результат (в десятичном смысле), однако:

     0100 << 1 =      1000   [ -8 dec ]
0000 0100 << 1 = 0000 1000   [ 16 dec ]

Проблемы с переносом:

     1000 << 1 =      0000   [  0 dec ]
0000 1000 << 1 = 0001 0000   [ 32 dec ]

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

1
ответ дан 18 December 2019 в 12:02
поделиться

манипуляции с битами требуют особой осторожности для обеспечения переносимости между системами / архитектурами.

В C операции << и >> можно сделать переносимыми с помощью беззнаковых переменных, который удаляет правила дополнения единиц / двоек для отрицательных чисел.

Как правило, не используйте маски фиксированной длины для манипуляций с битами (например, & и |). Это зависит от архитектуры.

Например. Сброс последних 4 бит: маска 0xF0 будет работать на 8-битном архитектура, но не 16 бит. Результаты будут другими (16-битные могут иметь другие установленные биты, не включенные в маску).

Чтобы решить эту проблему, используйте оператор ~. Маска ~ 0xF эквивалентна 0xF0, но будет работать на любой архитектуре . Все биты, кроме последних 4, будут сброшены

2
ответ дан 18 December 2019 в 12:02
поделиться
Другие вопросы по тегам:

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