Поделиться через


Спецификация размера

В спецификации формата четвертое поле — это модификатор длины аргумента для описателя преобразования. Префиксы поля size для поля type (h, l, w, I, I32, I64 и ll) определяют "размер" соответствующего аргумента — длинный или короткий, 32- или 64-разрядный, однобайтовый или расширенный символ — в зависимости от описателя преобразования, который они модифицируют. Эти префиксы размера используются с символами type в семействах функций printf и wprintf для определения интерпретации длин аргументов, как показано в следующей таблице. Поле size является необязательным для некоторых типов аргументов. Если префикс размера не указан, модуль форматирования использует целые аргументы, например подписанные или не подписанные char, short, int, long, и типы перечисления как 32-разрядные типы int, а аргументы с плавающей запятой используются как 64-разрядные типы double. Это соответствует правилам повышения аргументов по умолчанию для списков аргументов переменных. Дополнительные сведения о повышении аргументов см. в разделе Многоточия и аргументы по умолчанию. Как в 32-разрядной, так и в 64-разрядной системах спецификация формата 64-разрядного целого аргумента должна включать префикс размера ll или I64. В противном случае поведение модуля форматирования не определено.

Некоторые типы имеют разный размер в 32-разрядном и 64-разрядном коде. Например, size_t на 32 бита длиннее в коде, скомпилированном для x86, и на 64 бита длиннее в коде, скомпилированном для x64. Чтобы создать код форматирования для типов с переменным количеством байт, не зависящий от платформы, можно использовать модификатор длины аргумента с переменным количеством байт. Кроме того, можно использовать 64-разрядный модификатор длины аргумента и явно повысить тип аргумента с переменным количеством байт до 64 бит. Модификатор длины аргумента I Майкрософт обрабатывает целые аргументы с переменным количеством байт.

Примечание

Префиксы-модификаторы длины I, I32 и I64 являются расширениями Microsoft и не совместимы с ANSI.Префикс h при использовании с данными типа char, префикс w при использовании с данными типа wchar_t и префикс l при использовании с данными типа double являются расширениями Microsoft.Префиксы длины hh, j, z и t не поддерживаются.

Префиксы размера для описателей формата функций printf и wprintf

Чтобы указать

Используемый префикс

Со спецификатором типа

long int

l (строчная L)

d, i, o, x или X

long unsigned int

l

o, u, x или X

long long

ll

d, i, o, x или X

short int

h

d, i, o, x или X

short unsigned int

h

o, u, x или X

__int32

I32

d, i, o, x или X

unsigned __int32

I32

o, u, x или X

__int64

I64

d, i, o, x или X

unsigned __int64

I64

o, u, x или X

ptrdiff_t (то есть __int32 на 32-разрядных платформах, __int64 на 64-разрядных платформах)

I

d, i, o, x или X

size_t (то есть unsigned __int32 на 32-разрядных платформах, unsigned __int64 на 64-разрядных платформах)

I

o, u, x или X

long double (в Visual C++ хотя тип long double является отдельным типом, он имеет то же внутреннее представление, что и тип double).

l или L

a, A, e, E, f, g или G

Однобайтовый символ с функциями printf и wprintf. (Описатель типа hc или hC аналогичен c в функциях printf и C в функциях wprintf.)

h

c или C

Расширенный символ с функциями printf и wprintf. (Описатель типа lc, lC, wc или wC аналогичен C в функциях printf и c в функциях wprintf.)

l или w

c или C

Строка однобайтовых символов с функциями printf и wprintf. (Описатель типа hs или hS аналогичен s в функциях printf и S в функциях wprintf.)

h

s, S или Z

Строка расширенных символов с функциями printf и wprintf. (Описатель типа ls, lS, ws или wS аналогичен S в функциях printf и s в функциях wprintf.)

l или w

s, S или Z

См. также

Ссылки

printf, _printf_l, wprintf, _wprintf_l

Синтаксис описания формата: функции printf и wprintf

Директивы флагов

Спецификация ширины printf

Спецификация точности

Символы поля типа printf