Как и большинство объяснений, которые я видел, те, что выше, понятны о том, как работать с дополнением 2, но на самом деле не объясняют, что они математически. Я попытаюсь сделать это, по крайней мере, для целых чисел, и я расскажу о некоторых предпосылках, которые, вероятно, знакомы в первую очередь.
Вспомните, как это работает для десятичного: & nbsp; & nbsp; 2345 - способ записи & nbsp; ; & nbsp; 2 & times; 103 + 3 & times; 102 + 4 & times; 101 + 5 & times; 100.
Таким же образом двоичный метод является способом записи чисел, используя только 0 и 1, следуя одной и той же общей идее, но заменяя те 10s выше на 2s. Затем в двоичном формате 1111 является способом записи & nbsp; & nbsp; 1 & times; 23 + 1 & times; 22 + 1 & times; 21 + 1 & times; 20, и если вы это сделаете, то получится равным 15 (база 10). Это потому, что он равен 8 + 4 + 2 + 1 = 15.
Это хорошо и полезно для положительных чисел. Это даже работает для отрицательных чисел, если вы готовы просто придерживаться знака минус перед ними, как люди делают с десятичными числами. Это можно сделать даже на компьютерах, но я не видел таких компьютеров с начала 1970-х годов. Я оставлю причины для другого обсуждения.
Для компьютеров оказалось более эффективным использовать представление дополнения для отрицательных чисел. И вот что-то, что часто упускается из виду. Дополняющие обозначения включают в себя какой-то разворот цифр числа, даже подразумеваемых нулей, которые идут до нормального положительного числа. Это неудобно, потому что возникает вопрос: все они? Это может быть бесконечное число цифр, которые нужно учитывать.
К счастью, компьютеры не представляют бесконечности. Числа ограничены определенной длиной (или шириной, если хотите). Итак, вернемся к положительным двоичным числам, но с конкретным размером. Я буду использовать 8 цифр («бит») для этих примеров. Таким образом, наш двоичный номер действительно будет & nbsp; 00001111or & nbsp; & nbsp; 0 & times; 27 + 0 & times; 26 + 0 & times; 25 + 0 & times; 24 + 1 & times; 23 + 1 & times; 22 + 1 & times; 21 + 1 & times; 20
Чтобы сформировать отрицательное дополнение дополнения 2, мы сначала дополним все (двоичные) цифры до формы 11110000 и добавим 1 к форме 11110001, но как мы должны понимать, что это означает -15 ?
Ответ заключается в том, что мы меняем значение бит высокого порядка (самый левый). Этот бит будет 1 для всех отрицательных чисел. Изменение будет заключаться в изменении знака его вклада в значение числа, в котором оно появилось. Итак, теперь наш 11110001 понимается как & nbsp; & nbsp; -1 & times; 27 + 1 & times; 26 + 1 & times; 25 + 1 & times; 24 + 0 & times; 23 + 0 & times; 22 + 0 & times; 21 + 1 & times; 20Notice, что перед выражением? Это означает, что бит знака несет вес -27, то есть -128 (основание 10). Все остальные позиции сохраняют тот же вес, что и в двоичных числах без знака.
Разработка нашего -15, это & nbsp; -128 + 64 + 32 + 16 + 1 Попробуйте его на калькуляторе. это -15.
Из трех основных способов, которые я видел отрицательные числа, представленные в компьютерах, 2-го дополнения выигрывают руки для удобства в общем использовании. Впрочем, это странность. Поскольку это двоичный код, должно быть четное количество возможных комбинаций бит. Каждое положительное число может быть сопряжено с отрицательным, но есть только один ноль. Отрицание нуля приводит к нулю. Таким образом, есть еще одна комбинация, число с 1 в знаке и 0 везде. Соответствующее положительное число не будет соответствовать количеству используемых битов.
Что еще более странно в этом номере, так это то, что если вы попытаетесь сформировать свой позитив, дополняя и добавляя его, вы получите одинаковое отрицательное число назад. Кажется естественным, что ноль будет делать это, но это неожиданно и вовсе не то поведение, к которому мы привыкли, поскольку компьютеры в стороне, мы обычно думаем о неограниченном количестве цифр, а не об арифметике с фиксированной длиной.
Это похоже на верхушку айсберга странностей. Там больше лежат под поверхностью, но этого достаточно для обсуждения. Вероятно, вы можете найти больше, если вы исследуете «переполнение» для арифметики с фиксированной точкой. Если вы действительно хотите войти в него, вы можете также изучить «модульную арифметику».
Похоже, что vendor_id
отсутствует в самом кадре данных test
.
Попробуйте просмотреть список столбцов, представленных в test
, используя
test.columns