【发布时间】:2017-09-06 20:09:14
【问题描述】:
当我阅读这个article时,我看到了这段:
同样,不要努力去迎合 long 小于预定义类型(如 size_t)的可能性。比如下面的代码就可以了:
printf ("size = %lu\n", (unsigned long) sizeof array);
printf ("diff = %ld\n", (long) (pointer2 - pointer1));
1989 标准 C 要求它工作,我们只知道一个反例:Microsoft Windows 上的 64 位程序。我们将离开它 对于那些想要将 GNU 程序移植到那个环境的人来说 知道怎么做。
1989 年标准 C 真的允许这种代码吗?
【问题讨论】:
-
对于 C99 之前的版本,
long/unsigned long是最宽的标准类型 - 几乎不会丢失转换为最宽的整数类型。当然可以使用rintf ("size = %.0f\n", 1.0* sizeof array); -
@chux 但该代码符合标准吗?
-
它是合规的(除了可能在
pointer2 - pointer1中溢出)。问题仍然存在,它会打印预期的结果吗? (它被截断了吗?) -
大致是“在 C90 中,如果有什么标准可以工作,那就是这个”。它不能保证在所有情况下都有效,但它可以在大多数情况下工作。并且没有标准指定的替代方案可以更好地工作。从 C99 开始,您应该使用
z(用于size_t)和t(用于ptrdiff_t)大小修饰符:"%zu; %td\n"。 -
这应该适用于所有情况
void print_size(size_t sz) { if (sz >= 10) { print_size(sz/10); } printf("%u", (unsigned) (sz%10)); }