What is the purpose of format specifier "%qd" in `printf()`? What is the purpose of format specifier "%qd" in `printf()`? c c

What is the purpose of format specifier "%qd" in `printf()`?


%qd was intended to handle 64 bits comfortably on allmachines, and was originally a bsd-ism (quad_t).

However, egcs (and gcc before that) treats it as equivalent to ll, whichis not always equivalent: openbsd-alpha is configured so that long is64 bits, and hence quad_t is typedef'ed to long.In that particular case, the printf-like attribute doesn't work asintended.

If sizeof(long long) == sizeof(long) on openbsd-alpha, it should workanyway - i.e. %ld, %lld, and %qd should be interchangeable. On OpenBSD/alpha, sizeof(long) == sizeof(long long) == 8.

Several platform-specific length options came to exist prior to widespread use of the ISO C99 extensions, q was one of them. It was used for integer types, which causes printf to expect a 64-bit (quad word) integer argument. It is commonly found in BSD platforms.

However, both of the C99 and C11 says nothing about length modifier q. The macOS (BSD) manual page for fprintf() marks q as deprecated. So, using ll is recommended in stead of q.

References:

https://gcc.gnu.org/ml/gcc-bugs/1999-02n/msg00166.html

https://en.wikipedia.org/wiki/Printf_format_string

https://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p7


q means quad word format specifier in printf function which is used to handle 64 bits comfortably on all machines.

From Wikipedia:

Additionally, several platform-specific length options came to exist prior to widespread use of the ISO C99 extensions:

q - For integer types, causes printf to expect a 64-bit (quad word)integer argument. Commonly found in BSD platforms


One of most interesting C language related question to answer. The symbolic literal “%qd” represent as quad word, which is specified as used to handle 64 bits effectively with the printf function in the C programming language. Also just remember that, from 1999 edition of the C standard states that sizeof(long long) >= sizeof(long), and one can infer that the range of long long has a size of at least 64 bits.