printf() 的语法格式为:
%[parameter][flags][width][.precision][length]type
%zu 对照过来,z 属于 length 字段,u 属于 type 字段。
该表达式用来表明输出格式是长度型(size_t)的无符号整型值。其中 size_t 在不同的位数操作系统中定义是不同的:
/* 32位 */
typedef unsigned int size_t;
typedef int ssite_t;
/* 64位 */
typedef unsigned long size_t;
typedef long ssize_t;
因此在程序设计的时候,如果参数是 size_t 或者 ssize_t,在进行格式化输入或输出的时候务必使用 ‘z’ 修饰符,以防止显示异常。
常见的 %d、%x 等表示的是整型值,最多表示 4 个字节,而在 64 位系统中,数据有可能需要更多的字节表示,所有用 size_t 定义,就可以跨系统使用,不用担心溢出问题。对应的格式化显示的时候,也就不存在这个问题了。明白了这点,就可以理解 'z' 和 ‘l’ 等效了。‘z’ 只控制长度,具体的是有符号还是无符号,还是由后面的类型决定。