Узнайте немного больше об отрицательных числах в двоичном формате

JavaScript
Узнайте немного больше об отрицательных числах в двоичном формате

привет ~ Уважаемые сторожа, с Новым годом ~ Я думаю, что многие студенты знают, что если вы хотите преобразовать число в его противоположность в Javascript, в дополнение к добавлению числа перед ним-В дополнение к числу, вы также можете инвертировать число и добавить после этого 1. Из первого (по сути 0 минус соответствующее число) может получиться противоположное число, что полностью соответствует нашей интуиции, но почему его можно инвертировать и добавить 1, это не кажется очень научным, эта статья поможет вам найти вне~

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

начать с вычитания

Подсчитано, что вся детская обувь должна соблюдать следующее правило:

Вычитание числа равносильно добавлению противоположного числа.

Также следует понимать, что для того, чтобы различать положительные и отрицательные числа, старшим битом в двоичной системе является бит знака, где бит знака для положительных чисел равен 0, а бит знака для отрицательных чисел равен 1. В типе байта Java (8 бит, диапазон -128 ~ 127, т.е.00000000к11111111) например, если по интуиции, так как старший бит является знаковым битом, то -1 следует представлять как10000001. Идея красивая, но реальность очень худая.

Рассмотрим следующий вопрос: хотя отрицательное число является неопределенным, мы уверены, что положительное число 1 представлено как00000001, если нужно получить формулу1-1Результат , согласно указанному выше правилу расчета, можно преобразовать в1+(-1)операция, но10000001 + 00000001, независимо от того, как выполняется операция, кажется, трудно получить00000000Стоит ли это того? Видно, что не так просто сохранить значение отрицательных чисел в компьютере~

Переключить часы

Исследуйте отрицательный, кажется, попадает в тупик, поэтому давайте посмотрим первую смену внимания с экрана на часы на стене - предполагая, что часы часов и минуты могут быть отрегулированы отдельно, независимо друг от друга, и теперь часы показывают Время 10:40, но контраст GMT, быстро на 10 минут, то мы меняемся, как настроить часы это? Просто быть формулой:

    45
-   10
----------
    35

В результате получается 35, затем установите минутную стрелку на 35 и не нужно корректировать час. Очень просто, верно? Что если время сейчас 10:40, а время 15 минут, как мне настроить? Ваше сердце оценено, это не просто, вертикаль можно вычислить ~ но здесь добавьте требование, не хотите занимать по вертикали (то есть операция40-15Когда уменьшаемое не такое большое, как уменьшаемое, уменьшаемое должно заимствовать 1 из цифры десятков в цифру единиц), как это реализовать?

эммммммммм, это кажется более хлопотным~ Заимствование вызвано тем, что одно из уменьшаемых окончаний недостаточно велико.Если уменьшаемое число достаточно велико, кажется, что это может решить эту проблему. Оригинальная формула40-15, что можно эквивалентно переписать как40+(59-15)-59, ответ точно такой же. Но здесь все еще есть проблема: после двух операций остается формула84-59, вам все равно придется брать взаймы, не так ли? Тогда давайте перепишем это:40+(59-15)+1-60. После того, как эта формула рассчитана, заимствование больше не требуется. Чтобы переключиться на часы, просто установите минутную стрелку непосредственно на 25.

Увидев это, предполагается, что в вашем сердце появится немного больше понимания, но кажется, что есть еще некоторые неразумные вещи, верно? Например, такой пример: текущее время 10:15, и текущее время на 40 минут быстрее пекинского времени, как его рассчитать? Согласно приведенному выше примеру, мы можем записать эту формулу таким же образом15+(59-40)+1-60, но в конце возникает вопрос35-60, или занять место, не так ли?

Да, но может и не быть.-60Суть часов в том, чтобы повернуть часовую стрелку немного назад. Так35-60, на самом деле его можно разложить на две операции, часовая стрелка доводится до 35 позиции, часовая стрелка доводится до 9 позиции, текущее время 09:35, это не правильный ответ?

Не так разные оси

Сделайте паузу, прежде чем отдышаться, есть еще кое-что, что нужно понять. Я верю, что понятие числовой оси выгравировано в ваших сердцах. Оно совершенно интуитивное, и числовая ось бесконечна. Думаю, всем известно, что числовая ось в общем впечатлении выглядит следующим образом:

-60, -59, -58, -57···, -2, -1, 0, 1, 2···57, 58, 59

Но если числовая строка имеет диапазон, предполагая, что всего в числовой строке всего 120 целых чисел, и если мы хотим исключить отрицательный знак, то можно использовать положительные числа для представления отрицательных чисел. То есть -1 равно 119, -40 равно 80, -25 равно 95 и т. д.:

60, 61, 62, 63···118, 119, 0, 1, 2···57, 58, 59

Затем в предыдущем примере с часами в качестве уменьшаемого используется 59, чтобы избежать заимствования, но это для удобства часов.Здесь мы делаем еще один шаг вперед и работу часов только сейчас:15-40Это может быть выражено как15+80, результат операции равен 95, что можно получить, запросив таблицу. Значение 95 соответствует -25, и операция выполнена правильно!

Вы можете жаловаться, что вычитание — это заимствование, но оно сделано в основном для удобства сопоставления примера с часами, и замена его на 999 в качестве уменьшаемого, чтобы избежать заимствования, является стандартным дополнением 9. С таким же успехом можно нарисовать это на бумаге, в это время -1 это 999, -40 это 959, -25 это 974,15-40который015+959, результат операции 974, что тоже вполне соответствует.

вернуться к бинарному

С приведенным выше предзнаменованием двоичные отрицательные числа готовы выйти~ Бит знака, естественно, может использоваться в качестве точки разделения для положительных и отрицательных чисел. Или возьмите тип байта Java в качестве примера, 8 битов могут представлять в общей сложности 256 чисел, потому что 0 представлен как00000000, первый бит знака также равен 0, поэтому на одно положительное число меньше.Согласно примеру из предыдущего раздела, текущая последовательность выводится как:

10000001, 10000002···11111101, 11111110, 11111111, 00000000, 00000001···01111101, 01111110, 01111111

двоичное число Десятичная дробь
10000000 -128
10000001 -127
10000002 -126
··· ···
11011000 -40
··· ···
11100111 -25
··· ···
00001111 15
··· ···
01111111 127

Тогда это формула:15-40, что в двоичном формате00001111+11011000, посчитав немного пальцы, ответ 11100111, соответствующее значение равно -25! Однако эти часы ничего не значат с обратной стороны, так как же их рассчитать? Подумайте об этом, прежде чем вычислять15-40, мы конвертируем в15+(59-40)+1-60, 59 — достаточно большой минусенд, в байтовом типе наибольшее число не превысит11111111(т.е. 255), который можно преобразовать в:

    11111111(255)
-   00101000(40)
+   00000001(1)
+   00001111(15)
-  100000000(256)

Двоичный код на самом деле очень интересен, сначала посмотрите, что нужно вычислить в первую очередь.11111111-00101000Результатом является 11010111, то есть отрицание каждой позиции, следующий шаг - добавить один, и результат 11011000, не так ли значение, соответствующее -40 в таблице? Следовательно, вывод таблицы имеет строгий математический смысл, а не просто составлять таблицу. На данный момент вы должны понимать, почему на компьютере, принимая противоположное количество определенного числа - это инвертировать и добавить один ~

Последний шаг формулы является вычесть 256. Этот этап может быть сохранен в компьютере, поскольку 256 превысил диапазон байта и напрямую игнорируется. Точно так же, если расчет так как-1+1и т. д., ответ равен 256 (т. е. 100000000), но, поскольку он выходит за пределы диапазона, ведущая 1 просто игнорируется, поэтому ответ равен 0 . В приведенных выше операциях бит знака участвует в операции и не нуждается в другой обработке, что очень удобно для компьютера.

резюме

Для строгости добавлены два дополнительных условия:

  1. Все операнды являются целыми числами.
  2. Ни один из результатов расчета не переполняется.

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

Спасибо всем судьям за то, что увидели это, легче сказать, чем сделать, надеюсь, эта статья будет вам полезна~ Спасибо!

использованная литература

дополнять

Кодирование: язык, скрытый за программным и аппаратным обеспечением компьютера

как работает программа