我看到以下代码(函数的一部分):
if (end == start)
{
*max = *min = *start;
return 0x80000000;
}
我不明白为什么它返回0x80000000,即2^31
,并且它超出了 int 的范围并且类型为 unsigned int
它等于什么?
<小时/>完整代码:
int MaxDiffCore(int* start, int* end, int* max, int* min)
{
if (end == start)
{
*max = *min = *start;
return 0x80000000;
}
int* middle = start + (end - start) / 2;
int maxLeft, minLeft;
int leftDiff = MaxDiffCore(start, middle, &maxLeft, &minLeft);
int maxRight, minRight;
int rightDiff = MaxDiffCore(middle + 1, end, &maxRight, &minRight);
int crossDiff = maxLeft - minRight;
*max = (maxLeft > maxRight) ? maxLeft : maxRight;
*min = (minLeft < minRight) ? minLeft : minRight;
int maxDiff = (leftDiff > rightDiff) ? leftDiff : rightDiff;
maxDiff = (maxDiff > crossDiff) ? maxDiff : crossDiff;
return maxDiff;
}
最佳答案
0x80000000 未超出 int
的范围。 int
与平台相关,并且在某些平台上 int
是 32 位宽。这个数字是 32 位宽,因此它将对 int
进行“直接位分配”。
是的,这个数字的十进制表示形式是2^31
,但前提是您将这些位解释为无符号
,对于位而言,这没有什么意义。您确实需要查看 L 值才能知道它将被处理为什么,这是一个带符号的 int
/
现在,假设这是一个 32 位平台,这是一种编写 MIN_INT 的奇特方式,我所说的奇特是不可移植的,并且需要大量不稳定的假设,最终会让那些不这样做的人感到困惑不想做二进制数学。它假定 2 的补码数学并选择直接设置位。
基本上,对于 2 的补码,零仍然是
0x00000000
但要得到-1 + 1 = 0
,你必须添加一些东西到1上,产生0
0x????????
+ 0x00000001
= 0x00000000
所以你选择
0x11111111
+ 0x00000001
= 0x00000000
依靠携带1最终走出终点。然后你可以推断出 1 的下限是 -2,依此类推;直到-2 = 0x11111110
等等。基本上,由于第一位确定数字的“符号”,因此您可能拥有的“最大”负数将是 0x1000000
并且如果您尝试从中减去 1,您将从“负数”中进位"产生最大正数的符号位。 0x01111111
。
关于c - "return 0x8000 0000;"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36147034/