Это скорее любопытный запрос, чем важный вопрос, но почему при печати шестнадцатеричного числа в виде 8-значного числа с начальными нулями этот %#08X
Not не отображает тот же результат, что и 0x%08X
?
Когда я пытаюсь использовать первый, 08
флаг форматирования удаляется, и он не работает только с 8
.
Снова мне было просто любопытно.
0x%.8X
? Это будет приводить заполняются нулями. (0x
это просто преамбула, но вы, вероятно, уже знаете об этом).Ответы:
#
Часть дает вам0x
в выходной строке. Число0
иx
число против ваших "8" символов, перечисленных в08
части. Вам нужно попросить 10 символов, если вы хотите, чтобы он был таким же.Также меняется регистр
x
, влияет на регистр выводимых символов.источник
14F
?i = 0;
версии, использующие%#
не будет включать0x
префикс.«0x» учитывает счет до восьми символов. Вам нужно
"%#010x"
.Обратите внимание, что
#
это не добавляет 0x к 0 - результат будет0000000000
- так что вы, вероятно, на самом деле должны просто использовать в"0x%08x"
любом случае.источник
%#08X
Преобразование должно предшествовать значение с0X
; это требуется стандартом. В стандарте нет никаких доказательств того, что они#
должны изменять поведение08
части спецификации, за исключением того, что0X
префикс считается частью длины (так что вы можете / должны использовать%#010X
. Если, как и я, вам нравится ваш гекс, представленный как0x1234CDEF
, затем вы должны использовать0x%08X
для достижения желаемого результата. Вы можете использовать,%#.8X
и это также должно вставить ведущие нули.Попробуйте варианты в следующем коде:
На машине с RHEL 5, а также на Mac OS X (10.7.5) вывод был:
Я немного удивлен лечением 0; Я не понимаю, почему
0X
префикс пропущен, но с двумя отдельными системами это должно быть стандартным. Это подтверждает мои предубеждения против#
варианта.Обработка нуля в соответствии со стандартом.
(Акцент добавлен.)
Обратите внимание, что при использовании
%#X
будут использоваться заглавные буквы для шестнадцатеричных цифр и0X
в качестве префикса; Использование%#x
будет использовать строчные буквы для шестнадцатеричных цифр и0x
в качестве префикса. Если вы предпочитаете в0x
качестве префикса и прописных букв, вы должны коде0x
отдельно:0x%X
. Разумеется, при необходимости можно добавлять другие модификаторы формата.Для печати адресов используйте
<inttypes.h>
заголовок,uintptr_t
тип иPRIXPTR
макрос формата:Пример вывода:
Выбери свой яд по длине - я считаю, что точность 12 хорошо работает для адресов на Mac под управлением macOS. В сочетании с
.
указанием минимальной точности (цифр) он надежно форматирует адреса. Если вы установите точность до 16, дополнительные 4 цифры всегда будут равны 0 в моем опыте на Mac, но, безусловно, есть смысл использовать 16 вместо 12 в переносимом 64-битном коде (но вы бы использовали 8 для 32-битный код).источник