【问题标题】:What happens when evaluating `int x = -2147483648`?评估 `int x = -2147483648` 时会发生什么?
【发布时间】:2020-10-15 17:20:32
【问题描述】:

评估时会发生什么

int x = -2147483648

?

  1. 在计算-2147483648 时,2147483648 是一个整型常量,它的类型不是 int,而是 long 类型,因此计算 -2147483648 的结果 -2147483648 是 long 类型,而不是 int。

  2. 在评估赋值“int x = ...”时,RHS 是 long 类型的值 -2147483648,在 x 的类型 int 的范围内。值-2147483648是否会隐式从long转换为int,且转换保持-2147483648不变?

谢谢。

【问题讨论】:

  • 你的#1是一个问题还是一个断言?它读起来像一个断言。
  • 注意 #define INT_MIN (-2147483647 - 1) 的定义已经完成,因为 2147483648 不是 int 值,所以它不能被否定为 int。在我的机器上-2147483648long long 类型,因为longint 相同(可以是)。
  • 我对此投了反对票,因为这是您第四次重新要求不断关闭的同一副本,但以不同的形式隐藏了您真正想了解的内容-2147483648 的上下文作为 INT_MIN 的(错误)定义。
  • “2147483648 是一个整数常量,它的类型不是 int,”--> 可能。它可能需要输入long long

标签: c type-conversion integer


【解决方案1】:

您对这个问题的分析是正确的。因为该值在int 的范围内,并且作为初始化的一部分被转换为int(注意:赋值也会发生同样的情况),所以一切都按预期工作。

至于你没有问的问题的隐藏部分,因为它一直作为重复关闭,这并不意味着你可以将INT_MIN 定义为-2147483648。神奇之处在于=(作为赋值运算符或初始化构造中的标记)。在不使用它的上下文中,-2147483648 具有 longlong long 而不是 int 类型的各种方式会破坏 INT_MIN 的语义要求。例如:

  • (INT_MIN < 0U) == 0(因为两个操作数都提升为unsigned),但是
  • (-2147483648 < 0U) == 1(因为两个操作数都被提升为longlong long)。

【讨论】:

  • 在您的示例中,(-2147483648 < 0U) == 1 不是预期的,而(INT_MIN < 0U) == 0 令人惊讶吗?你不使用-2147483648的理由是什么?
  • @Tim:问题不在于它是否令人惊讶,而在于它是否是必需的行为。如果INT_MIN 扩展为int 类型的表达式,其值是int 类型的最小可能值,因为它被指定并因此需要,那么INT_MIN < 0U 必然为假。
  • 我在另一篇文章中提出了这个问题。它是否令人惊讶以及它有什么问题。
  • @Tim:您已经询问了 3 次以上,但它已被关闭为重复 3 次以上。这是错误的,因为规范说它扩展的表达式具有 int 类型,因此正确的程序可以依赖于它具有 int 类型的 any 结果,包括我的答案中的示例。跨度>
  • 为了扩展@dbush 所说的内容,如果您对现有的问题/答案不满意,当您的问题作为副本关闭时,不要伪装重新提问 把你想知道的实际东西埋起来。相反,请澄清您的问题有何不同以及您仍然想知道什么。
【解决方案2】:

此答案假定 C 实现使用 32 位 int 和 64 位 long

C 2018 6.4.4.1 说“整数常量的类型是可以表示其值的相应列表的第一个。”在下表中,无后缀的十进制常量条目包含列表intlong intlong long int。由于 long int 是可以表示 2,147,483,648 的第一个,因此 2147483648 的类型为 long int

根据 6.5.3.3 3,- 的结果是提升类型。整数提升 (6.3.1.1 2) 对 long int 没有影响。所以-2147483648的类型是long int

根据 6.7.9 11,初始化器的值转换为简单赋值。根据 6.5.16.1 2 和 6.5.16 3,该值将转换为左值转换后所分配对象的类型。也就是说,对于int 对象的赋值,类型是int 值。

根据 6.3.1.3 1,将整数类型的值转换为另一种整数类型时,如果新类型可以表示该值,则保持不变。由于int 可以表示-2,147,483,648,所以它没有变化。

因此,int x = -2147483648; 的结果是 x 被初始化为值 -2,147,483,648。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多