Ожидаемый ответ - 222, но результат отличается - PullRequest
0 голосов
/ 18 декабря 2018

Я сделал программу, используя приведенную ниже инициализацию

int j=35,l;
l=~j;

, если l напечатано как %d, тогда вывод равен -36

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Возможно, вы имеете в виду 220, как в этом случае:

#include <stdio.h>

int main() {
  char s = 35;
  unsigned char u = 35;

  char is = ~s;
  unsigned char iu = ~u;

  printf("~35 (signed) = %d\n", is);
  printf("~35 (unsigned) = %d\n", iu);

  return 0;
}

Где это печатается:

~35 (signed) = -36
~35 (unsigned) = 220

Помните, что int часто 32 или более бит, а не 8 какты ожидал.

0 голосов
/ 19 декабря 2018

220 - это значение без знака, представляющее отрицание 35 при сохранении с 8-битным типом данных.

int гарантируется стандартом C как равное как минимум 16 бит, так что вы никогда не получите значение 220 путем отрицания int, содержащего 35. Используйте uint8_t в <stdint.h>, чтобы сохранить значение 35 и его отрицание.

Такжеобратите внимание, что функции printf -семейства приводят аргументы %u и %d к unsigned int и int соответственно, поэтому при печати вы можете отсеивать старшие биты с помощью побитового AND.

0 голосов
/ 18 декабря 2018

Оператор побитового комплимента ~ инвертирует все биты своего операнда.Таким образом, предполагая, что int составляет 32 бита, двоичное значение:

00000000 00000000 00000000 00100011

становится таким после применения ~:

11111111 11111111 11111111 11011100

Предполагая, что отрицательные числа представлены в представлении дополнения до двух,это значение равно -36.

Ожидаемое значение 222 в двоичном виде выглядит следующим образом: int:

00000000 00000000 00000000 11011110

Таким образом, вы ожидаете, что только самый младший байтинвертируется, но вместо этого биты во всех байтах инвертируются.

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