Как сдвинуть отрицательные числа с помощью MySQL, чтобы получить результаты, как в Java, Python и т. Д.? - PullRequest
0 голосов
/ 27 июня 2019

Когда я хочу сдвинуть бит -2 >> 4, это должно дать мне -1. Python и Java дают мне -1. Но если я попробую это на моем сервере MySQL, я получу 1152921504606846975. Я попытался инвертировать биты, чтобы привести его в действие и т. Д. Но я не могу получить -1. Так кто-то знает, как сдвинуть его, чтобы получить -1.

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Согласно документации операторы сдвига битов MySQL генерируют 64-битное целое число без знака без знака .Поэтому, если вы хотите получить ожидаемое поведение с отрицательными числами, вы можете добавить свою собственную логику:

WITH yourTable AS (
    SELECT 4 AS val UNION ALL
    SELECT -4
)

SELECT
    IF(val > 0, val >> 2, -1.0*((-1.0*val) >> 2)) AS result
FROM yourTable;

Это выводит:

1
-1.0
1 голос
/ 27 июня 2019

>>

Сдвиг длинного (БОЛЬШОГО) числа вправо.

В результате получается 64-разрядное целое число без знака . Значение усекается до 64 бит. В частности, если число сдвигов больше или равно ширине 64-разрядного числа без знака, результат равен нулю.

-1 не относится к диапазону целого числа без знака.

...