Когда я даю переменной такое значение: e = 17|-15;
Я получаю -15 в качестве ответа после компиляции. Я не могу понять, что использует арифметика с ++. Как он выполняет побитовую операцию ИЛИ на отрицательных десятичных дробях?
Он просто выполняет операцию над двоичными представлениями ваших чисел. В вашем случае это, кажется, дополнение двух.
17 -> 00010001
-15 -> 11110001
Как видите, побитовый OR
из этих двух чисел до сих пор -15
,
В ваших комментариях выше вы указали, что пробовали это с представлениями дополнения двух, но вы, должно быть, сделали что-то не так. Вот шаг за шагом:
15 -> 00001111 // 15 decimal is 00001111 binary
-15 -> ~00001111 + 1 // negation in two's complement is equvalent to ~x + 1
-15 -> 11110000 + 1 // do the complement
-15 -> 11110001 // add the 1
Он выполняет операции ИЛИ с отрицательными числами так же, как и с положительными числами. Числа почти наверняка представлены в виде дополнения до двух, что дает вам следующие значения:
17 = 0000000000010001 -15 = 1111111111110001
Как видите, все биты 17 уже установлены в -15, поэтому результат их объединения снова равен -15.
Побитовое или с отрицательным числом работает ПРОСТО как побитовое или с положительным числом. Биты в одном номере состоят из битов в другом номере. То, как ваш процессор представляет отрицательные числа, это другой вопрос. Большинство используют то, что называется «дополнением до двух», что по сути означает «инвертировать число и добавить 1».
Итак, если мы имеем, для простоты, 8-битные числа:
15 is 00001111
Inverted we get 11110000
Add one 11110001
17 is 00010001
Ored together 11110001
17 = b00010001
-15 = b11110001 <--- 2s complement
| -15 = b11110001
Оператор |
является «побитовым OR
«оператор, означающий, что каждый бит в цели вычисляется как OR
-комбинация соответствующих битов в двух операндах. Это означает, что немного в результате 1
если любой из двух битов в числах в тех же позициях 1
, иначе 0
,
Ясно, что результат зависит от двоичного представления чисел, которое снова зависит от платформы.
Почти все платформы используют Два дополнения, который можно представить как круг чисел без знака, в котором отрицательные числа находятся только в противоположном направлении, чем положительные числа, и «окружают» круг.
Целые числа без знака:
Целые числа со знаком:
Расчет вашего примера выглядит следующим образом.
17: 00000000 00000000 00000000 00010001
-15: 11111111 11111111 11111111 11110001
------------------------------------------
-15: 11111111 11111111 11111111 11110001
Вы должны посмотреть, как работают биты
В основном, если любое число имеет 1
в конкретном месте, чем результат также будет иметь 1
-15 : 11110001 (two's complement)
17 : 00010001
-15 | 17 : 11110001
как видите, результат такой же, как -15