«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему fmt.Printf показывает другое двоичное представление отрицательных целых чисел, чем ожидалось в Go?

Почему fmt.Printf показывает другое двоичное представление отрицательных целых чисел, чем ожидалось в Go?

Опубликовано 8 ноября 2024 г.
Просматривать:583

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

Дополнение до двух и 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