как рассчитывается выход? - PullRequest
1 голос
/ 24 ноября 2010

Я запутался в этой программе, как значение х = 320 ...

#include<stdio.h>
 int a=5;
int main(){
    int x;
    x=~a+a&a+a<<a;
    printf("%d",x);
    return 0;
}

http://codepad.org/UBgkwdYl

в надежде на быстрый и положительный ответ ..

Ответы [ 4 ]

8 голосов
/ 24 ноября 2010

Это оценивается так:

x = ((~a) + a) & ((a + a) << a);

Вам следует просмотреть таблицы приоритетов оператора C.

8 голосов
/ 24 ноября 2010

На самом деле, это даст вам 320, только если ваша реализация использует кодировку дополнения до двух для целых чисел.Причина в том, что это интерпретируется как:

  (((~a) + a) & ((a + a) << a))
=      -1     &     (10   << 5)
=           10 << 5
=             320

-1 в дополнении к двум - все 1 бит, поэтому, когда вы and что с чем-либо, вы получите то же значение.

Однако с добавлением ~a + a даст вам ноль, так что конечный результат будет равен нулю.

Стандарт ISO C допускает кодирование дополнения до двух, дополнения до одного и знака / величины для целых чисел со знаком, и это однопричина, по которой такой код по своей сути плох.

1 голос
/ 24 ноября 2010
0 голосов
/ 24 ноября 2010

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

  • ~
  • +
  • &
  • << </li>

Учитывая таблицу приоритетов операторов для языков C , операторы будут оцениваться в следующем порядке:

  • ~
  • +
  • << </li>
  • &

Учитывая это, у нас есть следующие шаги:

  1. ~ 5. Побитовое отрицание 5 (в двоичном виде - 0000101) равно 250 (в двоичном - 11111010).
  2. ~ 5 + 5 - это 250 + 5 или 255.
  3. 5 + 5 равно 10.
  4. 10
  5. 255 (в двоичном виде это 11111111), объединенный в логической операции И с 320 (в двоичном виде это 101000000) дает значение 320 (в двоичном виде 101000000).

Это дает окончательное значение 320.

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