Дополнение до двух и fmt.Printf: разгадка загадки двоичного представления
При работе со знаковыми целыми числами компьютеры используют дополнение до двух для представления отрицательных значений . Это отличается от типичного двоичного представления, где знак обозначается отдельным битом. Например, в дополнении до двух целое число -5 представлено как 1111 1011.
Однако печать двоичного представления с помощью fmt.Printf может привести к неожиданным результатам. Например, следующий фрагмент кода:
var i int8 = -5 fmt.Printf("%b", i)
неожиданно выводит -101 вместо 1111 1011. Это несоответствие привело к вопросу о том, действительно ли дополнение до двух используется для внутреннего представления или форматирование скрывает правильное представление.
Чтобы пролить свет на этот вопрос, нам нужно углубиться в то, как fmt.Printf форматирует двоичные числа. Виновником является функция fmt.integer, которая автоматически преобразует целые числа с отрицательным знаком в положительные. Это преобразование включает в себя отрицание целого числа и добавление знака - к выходной строке. Таким образом, вывод -101 представляет собой представление -, добавленное к двоичному представлению 5.
Чтобы продемонстрировать это дальше, преобразуйте целое число со знаком в целое число без знака, а затем отформатируйте его с помощью fmt.Printf, чтобы получить правильные значения Two. дополняющее представление:
var u uint8 = uint(i) fmt.Printf("%b", u)
В результате выводится 11111011, то есть дополнение до двойки -5.
Следовательно, внутреннее представление целых чисел со знаком в Go соответствует дополнению до двойки. соглашение. Кажущееся неправильным двоичное представление при форматировании целых чисел со знаком возникает в результате автоматического преобразования и добавления знака, выполняемого fmt.integer. Понимание этого поведения необходимо при работе со знаковыми целыми числами и двоичными представлениями в Go.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3