В моем коде я читаю данные из массива 16-битных значений, где некоторые данные действительно содержат 32-битные переменные со знаком (из системы с прямым порядком байтов). Поэтому я сделаю что-то вроде:
$value = $data[$i] << 16 | $data[$i+1];
Это прекрасно работает в 32-битной системе, но при работе в 64-битной системе это будет интерпретироваться как положительное число (дополнение к двойкам как 32-битное число).
Конечно, я могу вручную проверить, установлен ли старший бит, и вычесть, но это становится немного неуклюжим, тем более, что я хотел бы, чтобы код работал как на 32, так и на 64-битных системах.
Есть ли простой и хороший способ сделать это?