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