2017-05-26 23 views
2

假设我有,例如,uint32_t类型的变量i。打印出来的预期的方法是这样的:在预期PRIu32的printf格式字符串中使用%lu是否有效?

printf("%"PRIu32"\n", i); 

但是,应该指出的是,它需要long unsigned int至少为32位宽。 long unsigned int的正确说明符是%lu。因此,上面的陈述可以被替换为:

printf("%lu\n", i); 

我想是的,因为我看不到没有理由。然而,如果是的话,那么这将消除像PRIu32这样的宏化指定符的存在需要,所以我想我最好问。

我问这个问题的原因是我想动态地为printf创建一个格式字符串,如果我不知道字符串的大小,就很难为这个格式字符串分配空间PRIu32扩展为(以及sizeof(PRIu32)是否有效可能值得单独提问)。

在任何情况下,我想这应该是有效的写:

printf("%lu\n", (long unsigned)i); 
+0

您的以下C99或C89标准是什么? – LethalProgrammer

+0

@LethalProgrammer C11。 – gaazkam

+0

好的,你已经得到了答案。 – LethalProgrammer

回答

7

因此,可以在上面的语句替换为:

printf("%lu\n", i); 

我想是的,因为我可以看到没有理由为什么不。

没有,因为long unsigned int可以更大超过32位,或者如果恰好32位仍然可以有不同的表示比确实uint32_t

在任何情况下,我想这应该是有效的写:

printf("%lu\n", (long unsigned)i); 

是的,正如你观察到的,这也是安全,因为long unsigned int需要能够代表uint32_t可以采用的所有值。

+0

在什么情况下,实现可以定义'uint32_t'并且有一个32位的'unsigned long'('long unsigned int'是'unsigned long'的替代名称),但是却有不同的表示? §7.20.1.1_Exact integer types_表示如果实现支持它作为32位补码表示并且没有填充位,则只应定义“int32_t”,并且“uint32_t”是相应的无符号类型。如果机器使用补码或符号大小,则不应定义精确宽度的整数类型。但是,这是为了“不同的表现”。 –

+1

@JonathanLeffler该标准并不要求只有一个整数类型具有任何给定的大小和符号组合,或者两个这样的类型共享一个共同的表示。例如,可能有两种不同字节顺序的这种类型,或者不同数量的填充位。这些都可以是标准整数类型(例如'unsigned int'和'unsigned long'),或者可以是实现的扩展整数类型之一。 –

+0

好的 - 我不打算追逐这种可能性的标准。他们太古怪了,如果你遇到过,我会感到惊讶,如果你曾经遇到过,我会感到非常惊讶。 –

相关问题