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

时间:2013-04-26 05:25:35

标签: c

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

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

#define INT24_MAX 0x7fffff

#define INT24_MIN (-INT24_MAX - 1)

为什么不这样做?

#define INT24_MIN (~INT24_MAX)

2 个答案:

答案 0 :(得分:5)

假设int是32位且可以保留0x7fffff,那么~0x7fffff将是~0x007fffff,或者在所有位被反转之后0xff800000 }}

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

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

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

正如您所看到的,~0x7fffff的值将取决于负整数的表示以及可以保存值0x7fffff的类型的大小。

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

答案 1 :(得分:5)

更好的问题可能是您认为(~INT24_MAX)优于(-INT24_MAX - 1)的原因?

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

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

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