我正在从https://github.com/antirez/redis阅读 redis 的源代码。
我在 src/ziplist.c 中看到了这样的宏
#define INT24_MAX 0x7fffff
#define INT24_MIN (-INT24_MAX - 1)
为什么不这样做呢?
#define INT24_MIN (~INT24_MAX)
我正在从https://github.com/antirez/redis阅读 redis 的源代码。
我在 src/ziplist.c 中看到了这样的宏
#define INT24_MAX 0x7fffff
#define INT24_MIN (-INT24_MAX - 1)
为什么不这样做呢?
#define INT24_MIN (~INT24_MAX)
假设int
是 32 位并且可以容纳0x7fffff
,那么~0x7fffff
将是 ,~0x007fffff
或者,在所有位都被反转之后,0xff800000
。
-0x7fffff-1
如果负整数使用 2 的补码表示,则此位模式表示负值。
如果他们使用 1 的补码表示,则此模式表示负值-0x7fffff
。
如果他们使用符号幅度表示,则此模式表示负值-0x7f800000
。
如您所见, 的值~0x7fffff
将取决于负整数的表示形式以及可以容纳该值的类型的大小0x7fffff
。
如果您尝试编写可移植的 C 代码,您应该避免这种情况。
一个更好的问题可能是你为什么认为(~INT24_MAX)
比(-INT24_MAX - 1)
?
在二进制补码机器上,您可以从任一表达式获得相同的结果,并且它们的计算速度都与另一个相同(对于 32 位目标,编译器会将它们都减少到0xff800000
编译时)。但是,在我看来,该表达式(-INT24_MAX - 1)
更好地模拟了最小值比最大值的否定小一的数字概念。
这可能并不重要,但(~INT24_MAX)
客观的表达方式并没有更好,我认为主观上它可能没有那么好。
基本上,(-INT24_MAX - 1)
这可能是编码人员碰巧想到的(也许正如我所提到的,它模拟了数字上的意图),并且没有理由使用其他东西。