当前位置: 首页 > 知识库问答 >
问题:

为什么我们将INT_MIN定义为-INT_MAX-1?

徐涵亮
2023-03-14

哎呀,这是一个标准的“成语”

#  define INT_MIN   (-INT_MAX - 1)  
#  define INT_MAX   2147483647    

问:为什么INT_MIN的定义不是as-2147483648?

共有1个答案

太叔富
2023-03-14

因为2147483648是一个long值,因为它不适合int(在具有32位int和64位long的常见系统中,在具有32位long的系统上,它是long long类型)。所以-2147483648long类型,而不是int类型。

请记住,在C中,未后缀的十进制整数常量是可以表示的第一种类型intlonglong long

此外,在C中-2147483648不是整数常数2147483648是一个整数常数-2147483648是由一元运算符和整数常数构成的表达式。

编辑:如果您不相信-2147483648不是int类型(评论中的一些人似乎仍然怀疑),您可以尝试打印以下内容:

printf("%zu %zu\n", sizeof INT_MIN, sizeof -2147483648);

你很可能会得到:

4 8

在通用32位和64位系统上。

另外,为了跟随评论,我正在谈论最近的C Standard:使用c99或c11方言来测试这个。c89对十进制整数常量的规则不同:-2147483648在c89中是无符号长类型。事实上,在c89中(在c99中有所不同,见上文),未后缀的十进制整数常量是intlong无符号长类型。

EDIT2:@WhozCraig添加了另一个示例(但对于C)来显示-2147483648不是int类型。

下面的例子虽然是C语言的,但说明了这一点。它是用32位架构g编译的。请注意从传递的参数推导中收集的类型信息:

#include <iostream>
#include <climits>

template<typename T>
void foo(T value)
{
    std::cout << __PRETTY_FUNCTION__ << '\n';
    std::cout << value << '\n';
}

int main()
{
    foo(-2147483648);
    foo(INT_MIN);
    return 0;
}

输出

void foo(T) [T = long long]
-2147483648
void foo(T) [T = int]
-2147483648

 类似资料:
  • 问题内容: 为什么Java不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。

  • 问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)

  • 问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则

  • 问题内容: 在我的Linux机器上,是一个普通的旧机器。DO 拥有一种特殊的原子质量? 问题答案: C99 仅符合非常小的“原子性”定义,因为 C99没有并发概念 ,只有可中断性。(C2011添加了一个并发模型,并使用它来保证更强的类型;但是,AFAIK 保持不变,因为其 存在的理由 仍然是与信号处理程序通信,而不是跨线程。) 这就是C99所说的: (第7.14节,第2段)定义的类型为,它是对象的

  • 我已经为我的自定义日志拦截器执行了以下操作 我正在将拦截器设置为restTemboard 记录器正在将响应正确地打印到控制台,但最后响应会以空的形式返回给调用者。我无法调试和解决它。 我已经弄明白了StreamUtils。copyToString(response.getBody(),字符集。defaultCharset())正在读取一次输入流,并且不再在其中保存响应正文(现在为空) 还有谁也面临

  • 问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。