gpt4 book ai didi

c - 为什么 0 < -0x80000000?

转载 作者:太空狗 更新时间:2023-10-29 16:13:41 25 4
gpt4 key购买 nike

下面有一个简单的程序:

#include <stdio.h>

#define INT32_MIN (-0x80000000)

int main(void)
{
long long bal = 0;

if(bal < INT32_MIN )
{
printf("Failed!!!");
}
else
{
printf("Success!!!");
}
return 0;
}

条件if(bal < INT32_MIN )总是正确的。怎么可能?

如果我将宏更改为:

#define INT32_MIN        (-2147483648L)

谁能指出问题所在?

最佳答案

这很微妙。

程序中的每个整数文字都有一个类型。它有哪些类型由6.4.4.1中的表格规定:

Suffix      Decimal Constant    Octal or Hexadecimal Constant

none int int
long int unsigned int
long long int long int
unsigned long int
long long int
unsigned long long int

如果文字数字不能放入默认值 int类型,它将尝试下一个更大的类型,如上表所示。所以对于常规的十进制整数文字,它是这样的:

  • 尝试 int
  • 如果放不下,试试long
  • 如果放不下,试试long long .

不过,十六进制文字的行为有所不同! 如果文字无法放入像 int 这样的带符号类型中, 它会先尝试 unsigned int在继续尝试更大的类型之前。区别见上表。

所以在 32 位系统上,您的文字 0x80000000类型为 unsigned int .

这意味着您可以应用一元 -在不调用实现定义的行为的情况下对文字进行运算符,否则会在溢出有符号整数时发生。相反,您将获得值 0x80000000 , 正值。

bal < INT32_MIN调用通常的算术转换和表达式 0x80000000 的结果从 unsigned int 提升至 long long .值0x80000000被保留且 0 小于 0x80000000,因此结果。

当您将文字替换为 2147483648L 时您使用十进制表示法,因此编译器不会选择 unsigned int , 而是尝试将其放入 long 中. L 后缀也表示您想要一个 long 如果可能的话。如果你继续阅读 6.4.4.1 中提到的表格,L 后缀实际上有类似的规则:如果数字不适合请求的 long。 ,它在 32 位情况下不是,编译器会给你一个 long long它适合的地方。

关于c - 为什么 0 < -0x80000000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com