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

Eva*_*ran 5 c c99

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

所以't'修饰符定义为

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

那么,如果将它与无符号整数转换相结合,应该会发生什么?显然o,u,x和X都被解释为无符号值,而d和i是有符号的.

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

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

事实上,没有任何"坏"发生,事实上,在打印所有测试的东西的预期值,除了" INT_MIN"(假设sizeof(int) == sizeof(ptrdiff_t).

printf("%tu %td\n", INT_MIN, INT_MIN);
Run Code Online (Sandbox Code Playgroud)

版画

2147483648 -2147483648
Run Code Online (Sandbox Code Playgroud)

在32位系统上.

标准对此有何看法?我认为答案将是"未定义的行为".但我想我会问;).

jpa*_*cek 3

这没东西看。你写的代码是合法的。

只是一些事实说明原因:

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