Давайте посмотрим на приведенный ниже java-код и попытаемся предсказать результат, прежде чем погрузиться в решение ... Хорошо, давайте начнем веселье.

N.B. → Здесь d2b (int decimal) - это метод, преобразующий десятичное число в двоичное и выводящий вывод в консоль. Вы можете увидеть полный код здесь.

Надеюсь, вы угадали результат. Теперь посмотрим на фактический результат.

Объяснение:

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

Теперь, если вы внимательно понаблюдаете, становится ясно, что Выход-5 и Выход-6 - это одно и то же. Итак, мы можем сказать, y = - (x) = (~ x + 1). Я объясню это позже, но сначала позвольте мне прояснить несколько моментов: -

  1. «~» → этот оператор называется оператором побитового дополнения (побитового НЕ). Например, ~ of 1, т.е. ~ 1 = 0 и ~ 0 = 1. «00001010» → это 8-битное двоичное представление десятичного числа 10. Теперь ~ 00001010 будет = 11110101
  2. Что означает (255 & x)? Ну, «&» - это побитовый оператор И. 8-битное двоичное представление 255 - это «11111111». Если значение x равно 10, то значение (255 и 10) будет эквивалентно (11111111 и 00001010). Таким образом, результат такой же, как 00001010. В Output-1 значение (255 & x) автоматически преобразуется в десятичную форму, то есть 10.
  3. В Выходе-2 произошло волшебство. Предполагается, что оно должно быть -10 (фактическое значение y). На самом деле JAVA обрабатывает отрицательные целые числа по-другому. Например, десятичное значение 10 сохраняется как «00001010», но JAVA сохраняет значение -10 как (~ 10 + 1) = (~ 00001010 + 1) = (11110101 + 1) = 11110110. Эта операция фактически называется дополнением до 2. Таким образом, во время вычисления (255 & y), то есть (255 & -10), оно вычисляется как (11111111 & 11110110), десятичный эквивалент которого равен 246. Хе-хе !!

Теперь перейдем к уравнению y = - (x) = (~ x + 1),. Положив значение x = 10, мы можем получить y = -10 = (~ 10 + 1). Таким образом, java обрабатывает -10 и (~ 10 +1), поскольку оба они одинаковы в двоичной форме. Надеюсь, теперь ясно. Также очевидны Выход-3, Выход-4, Выход-5, Выход-6.

JAVA обрабатывает отрицательное целое число в int, short, long так же, как и в случае байта.

Возникают вопросы, а как тогда трактуется число Ноль?

Ну, ноль - это все 0. Если JAVA начнет обрабатывать положительный ноль (0) и отрицательный ноль (-0) по-разному, это создаст большую двусмысленность, поскольку в сценарии реальной жизни оба они одинаковы. Благодаря свойству дополнения 2 для решения этой проблемы. Предположим, что положительный ноль (0) хранится в 8-битном хранилище как 00000000. Теперь отрицательный ноль (-0) сохраняется как (~ 0 +1) = (~ 00000000 + 1) = (11111111 + 1) = 100000000. Итак, чтобы получить 2 дополнения к 8 битам 00000000 мы получаем 9-битное число, которое не может быть размещено в 8-битном пространстве. Таким образом, самый левый бит отбрасывается, и у нас остается только 00000000. Еще одна вещь, которую нужно сказать, что если мы возьмем двойное дополнение дважды числа, мы получим то же самое число, и это также отражает тот факт, что двойное отрицательное число приводит к только тот же номер.

Спасибо за чтение. Это мой первый пост на Medium. Также он может содержать грамматические ошибки. Но я старался изо всех сил. Приветствуются любые советы, советы, критика. Еще раз спасибо, хорошего дня !!