c - "return 0x8000 0000;"是什么意思?

标签 c

我看到以下代码(函数的一部分):

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/

相关文章:

c - 使用c使用指针反转句子中的单词

c - 如何减少表达

c - 确定 SDL_surface 的宽度/高度的 SDL_function?

c++ - 为什么 windows.h 禁用包警告?

c - 阅读操作系统的好资源

c - 多维数组和指针数学

c - C 中数字的唯一组合

c - Helgrind 报告的 OpenSSL libcrypto.1.0.0 CRYPTO_malloc() 中可能的数据竞争条件

c - open(name, O_CREAT|O_DIRECTORY, mode) 的预期行为是什么?

c - 如何在 C 中将二维数组作为参数传递?