5

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

所以't'修饰符定义为

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

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

同样size_tssize_t除了ptrdiff_t.

实际上,没有什么不好的事情发生,因为类型的无符号版本与有符号版本占用的空间量相同。所以右边的字节会从堆栈中弹出。

因此,实际上,在打印除“”之外的所有测试事物的预期值时,没有发生任何“坏” INT_MIN(假设sizeof(int) == sizeof(ptrdiff_t).

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

印刷

2147483648 -2147483648

在 32 位系统上。

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

4

1 回答 1

3

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

关于原因的一些事实:

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