我只是在查看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位系统上。
标准对此有何意见?我认为答案将是“未定义的行为”。但我想我会问;)。
答案 0 :(得分:3)
这里没什么可看的。你写的代码是合法的。
关于原因的一些事实:
ptrdiff_t
被规定为标准的有符号整数类型。因此,它有一个未签名的双胞胎。 (事实上,类似的逻辑同样适用于size_t
- ssize_t
不是C,而是POSIX)t
长度说明符必须与d
,i
,o
,u
,x
,X
类型一起使用