Я понимаю, что %zd
— это рекомендуемый способ форматирования результата sizeof
. Однако я не понимаю, зачем это нужно. Например, использование lu
дает мне тот же результат, и в любом случае результат sizeof
не является беззнаковым длинным? Например:
printf("Sizeof(char): %lu, Sizeof(short): %lu, Sizeof(int): %lu, Sizeof(long): %lu, Sizeof(long long): %lu, Sizeof(float): %lu, Sizeof(double): %lu, Sizeof(long double): %lu\n"
,sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long), sizeof(float), sizeof(double), sizeof(long double));
printf("Sizeof(char): %zd, Sizeof(short): %zd, Sizeof(int): %zd, Sizeof(long): %zd, Sizeof(long long): %zd, Sizeof(float): %zd, Sizeof(double): %zd, Sizeof(long double): %zd"
,sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long), sizeof(float), sizeof(double), sizeof(long double));
Sizeof(char): 1, Sizeof(short): 2, Sizeof(int): 4, Sizeof(long): 8, Sizeof(long long): 8, Sizeof(float): 4, Sizeof(double): 8, Sizeof(long double): 16
Sizeof(char): 1, Sizeof(short): 2, Sizeof(int): 4, Sizeof(long): 8, Sizeof(long long): 8, Sizeof(float ): 4, Sizeof(двойной): 8, Sizeof(длинный двойной): 16
Какова причина или преимущество использования %zd
и почему это было добавлено в первую очередь?
sizeof
являетсяsize_t
, который может совпадать или не совпадать сunsigned long
, в зависимости от используемого компилятора, ОС и процессора. И спецификатором формата является%zu
, так какsize_t
не имеет знака. - person user3386109   schedule 10.01.2021size_t
что-то вродеtypedef size_t int
илиtypedef size_t <something-else>
в зависимости от платформы? - person carl.hiass   schedule 10.01.2021long
почти никогда не бываетsize_t
в большинстве встроенных систем. - person phuclv   schedule 10.01.2021size_t
,unsigned long
иunsigned int
все имеют 32-битный размер (а они могут быть), не имеет значения, используете ли вы%zu
,%lu
или%u
, но код не переносим. Вот почему вам нужно использовать правильный спецификатор, чтобыprintf()
знал размер передаваемого аргумента. Все, что у него есть, это promise от спецификатора формата, и он должен верить, что вызывающий объект передал операнд правильного размера. У него нет другого способа узнать, и программист должен сопоставить формат с типом. - person Weather Vane   schedule 10.01.2021