TLDR: -13 и 3 не имеют одинаковых двоичных значений. Путаница возникает из-за игнорирования явного знака и заполнения/ширины.
Целые числа Python ведут себя как беззнаковые двоичные числа произвольной ширины с отдельным битом знака. Не существует общего однозначного двоичного представления для чисел со знаком.
Например, 12 — это число ...1100
и знак +
, а -12 — это то же число ...1100
, но со знаком -
. Примечательно, что ...
может состоять из произвольного количества начальных цифр — 1100
, 01100
, 001100
и так далее — это одно и то же число. Это 0-заполнение позволяет обрабатывать как маленькие, так и большие числа, например. по крайней мере 4-значный 12 ...1100
может быть выровнен по крайней мере с 5-значным 16 ...10000
.
Это означает, что не может быть определенного бита начального знака, поскольку каждой позиции может предшествовать другой 0
. Вместо этого бит знака произвольно предшествует числу: 0...1100
или +...1100
равно 12, а 1...1100
или -...1100
равно -12. Это видно в каноническом побитовом представлении чисел, разделяющих знак и абсолютное значение.
>>> bin(12)
0b1100
>>> bin(-12)
-0b1100
Таким образом, 4-значное побитовое дополнение 12 равно -0011
, а 3 равно +0011
.
person
MisterMiyagi
schedule
14.09.2020
-13
в двоичном формате - это все единицы, кроме этих битов. Это не0011
. Это11...110011
. - person khelwood   schedule 14.09.202010011
как пятибитного двоичного кода со знаком для ~ 12, а не 19? - person S3DEV   schedule 14.09.2020~
не является дополнением до 1. Он определяется как~x == -(x+1)
, что соответствует дополнению 2 произвольной точности. - person MisterMiyagi   schedule 14.09.202010011
является даже числом, это также может быть глиф ASCIICR
или первая половина глифа UTF-8Ꮢ
. Идя дальше, вы технически должны знать порядок следования байтов и битов —10011
может быть25
в целочисленном беззнаковом порядке следования байтов. - person MisterMiyagi   schedule 14.09.2020