关于不兼容的printf格式说明符的问题

时间:2009-03-31 21:42:34

标签: c c99

我只是在查看printf的手册页,我发生了一些事情。我想知道这里是否有任何“语言律师”可以回答一个相对简单的问题:-P。

因此't'修饰符定义为

  

以下整数转换   对应于ptrdiff_t参数。

如果将此与无符号整数转换相结合,那么假设会发生什么?显然o,u,x和X都被解释为无符号值,而d和i则被签名。

同样,除了size_t之外,所有修饰符都有签名/无符号版本(int / unsigned int,ssize_t / ptrdiff_t等)。

实际上,没有任何不好的事情发生,因为无符号版本的类型占用与签名版本相同的空间量。所以关于字节的权利会从堆栈弹出。

所以没有“坏”发生,事实上,除了“INT_MIN”之外,打印所有测试事项的预期值(假设sizeof(int) == sizeof(ptrdiff_t)

printf("%tu %td\n", INT_MIN, INT_MIN);

打印

2147483648 -2147483648

在32位系统上。

标准对此有何意见?我认为答案将是“未定义的行为”。但我想我会问;)。

1 个答案:

答案 0 :(得分:3)

这里没什么可看的。你写的代码是合法的。

关于原因的一些事实:

  • 所有带符号的整数类型都有未签名的对应项,具有相同的大小/对齐要求
  • ptrdiff_t被规定为标准的有符号整数类型。因此,它有一个未签名的双胞胎。 (事实上​​,类似的逻辑同样适用于size_t - ssize_t不是C,而是POSIX)
  • t长度说明符必须与diouxX类型一起使用