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

Pas*_*uoq 12 c zlib

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

strm->avail_out = (unsigned)(out < end ?
                             257 + (end - out) : 257 - (out - end));
Run Code Online (Sandbox Code Playgroud)

变量endout是两个指针到输出缓冲区.这种说法作出了努力来计算end - out的时候end > outout - endout >= end,但我不明白为什么会想这样做.在我看来,最终的结果是相同的,也就是说,这条线也可能已被写入:

strm->avail_out = 257 + (end - out);
Run Code Online (Sandbox Code Playgroud)

两个指针的区别有一个带符号的整数类型ptrdiff_t(C99 6.5.6:9),并且257有类型int.增加发生在这两者之间的更高等级的类型,我不知道三元运营商可能正在防范什么.

Mar*_*ler 17

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

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

至于改变的历史,那段代码是从你今天看到的Zeus的眉毛中诞生的.它自写完以来就没有改变过.