为什么zlib只努力计算正指针差异?

时间:2013-01-17 07:53:42

标签: c zlib

在zlib 1.2.7,文件inffast.c,第320行,有一个我不明白的声明:

strm->avail_out = (unsigned)(out < end ?
                             257 + (end - out) : 257 - (out - end));

变量endout是输出缓冲区的两个指针。 此声明会在end - out时计算end > outout - end时计算out >= end,但我不明白为什么要这样做。在我看来,最终的结果是相同的,也就是说,这条线也可以写成:

strm->avail_out = 257 + (end - out);

两个指针的差异有一个有符号整数类型ptrdiff_t(C99 6.5.6:9),而257int类型。增加发生在这两者之间的更高等级的类型,我不明白三元运营商可能会防范什么。

1 个答案:

答案 0 :(得分:17)

您对C99以及C89 / C90的观察是正确的。

这行代码是十年前写的。在这一点上,我的记忆只允许我以偏执狂为借口。显然我担心在某些编译器中,减去两个指针的结果可能是无符号的。我不记得那个问题的根源,或者它是否有任何基础。

对于change history,这行代码是从你今天看到的Zeus的眉毛中诞生的。自写完以来它没有改变。