Как поразрядно или нет оператор работает? - PullRequest
1 голос
/ 15 апреля 2019
#include<stdio.h>
void main()
{
  int a, b, c;
  a=5;
  b=8;
  c= ~(a|b);
  printf("%d",c);
} 

Ожидаемый результат - -13, но результаты показывают -14.Как это - 14?.

Ответы [ 5 ]

2 голосов
/ 15 апреля 2019

Поскольку у вас есть компьютер с дополнением 2.

  • 5 |8 дает двоичный код 0101 | 1000 = 1101 = 13 дек.
  • Инвертируйте это с помощью ~, и вы получите 1111....0010.
  • Представляя, что как тип со знаком, в дополнении 1 это было бы -13 дек.
  • Но для дополнения 2 мы вычитаем 1 и получаем -14 дек.

По той же причине, что и ~0 дает дополнение 2 -1, а не -0.

0 голосов
/ 15 апреля 2019

Это из-за дополнения 2.

Использование 8-битных значений со знаком (работает так же, как 32-битных со знаком, но это легче продемонстрировать):

8:        00001000
5:        00000101
8 | 5:    00001101
~(8 | 5): 11110010 = 242 (unsigned)

Быстрый способдополнение до 2, когда MSb высокий, означает вычитание 2 ^ n (здесь n равно 8, 2 ^ 8 равно 256)

242-256 = -14

0 голосов
/ 15 апреля 2019

Предположим, вы используете 8-битные целые числа:

  • a=5 представляется как 00000101
  • b=8 представляется как 00001000
  • a|b является 00001101

Когда вы инвертируете биты, это будет 11110010, что в дополнении к двум равно -14.

0 голосов
/ 15 апреля 2019

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

Сначала у вас есть a|b (для простоты я покажу только младшие 8 бит):

  a  00000101  5
| b  00001000  8
 ------------
     00001101  13

Тогда побитовое НЕ:

   ~ 00001101  13
   ----------
     11110010  -14

Выполнение побитового НЕ для положительного значения не дает вам его отрицательного значения, оно дает вам на меньше .

0 голосов
/ 15 апреля 2019

вы путаете дополнение к одному (~) и дополнение к двум / унарный оператор -

~(5|8) это -(5|8) - 1 так -13 - 1 так -14

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...