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

Почему fmt.Printf выводит «-101» для целого числа со знаком, представленного в виде дополнения до двух?

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

Why Does fmt.Printf Output \

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