为什么不使用VAL的补码代替(-VAL -1)

Ark*_*har 3 c

我正在从https://github.com/antirez/redis上阅读redis的源代码.

我在src/ziplist.c中看到过这样的宏

#define INT24_MAX 0x7fffff

#define INT24_MIN (-INT24_MAX - 1)
Run Code Online (Sandbox Code Playgroud)

为什么不这样做呢?

#define INT24_MIN (~INT24_MAX)
Run Code Online (Sandbox Code Playgroud)

Ale*_*nze 5

假设,int是32位并且可以保持0x7fffff,然后~0x7fffff将是~0x007fffff或者,在所有位被反转之后,0xff800000.

-0x7fffff-1如果负整数使用2的补码表示,则该位模式表示负值.

如果他们使用1的补码表示,则此模式表示负值-0x7fffff.

如果他们使用符号幅度表示,则该模式表示负值-0x7f800000.

如您所见,值的~0x7fffff大小取决于负整数的表示以及可以保存该值的类型的大小0x7fffff.

如果您正在尝试编写可移植的C代码,则应该避免这种情况.


Mic*_*urr 5

一个更好的问题可能是你认为为什么(~INT24_MAX) 比这更好(-INT24_MAX - 1)

在二进制补码机器上,您从任一表达式获得相同的结果,并且它们的评估速度与另一个一样快(对于32位目标,编译器将在编译时将它们减少到两者0xff800000).但是,在我看来,该表达式(-INT24_MAX - 1)模拟了数值概念,即最小值比最大值的否定更好.

这可能没有任何重要意义,但表达(~INT24_MAX)方式在客观方面并不是更好,我认为主观上它可能不会那么好.

基本上,(-INT24_MAX - 1)可能是编码器碰巧想到的(也许正如我所提到的,它模拟了数字上的意图),并且没有理由使用其他东西.