【问题标题】:Result of (int)-2147483648 divided by (int)-1, using different compilers? [closed](int)-2147483648 除以 (int)-1 的结果,使用不同的编译器? [关闭]
【发布时间】:2012-12-28 13:49:05
【问题描述】:

众所周知,最小整数因编译器而异,所以我有一个问题:使用各种编译器时(int)-2147483648除以(int)-1的结果是什么?比如VC6.0、VS2010等?

【问题讨论】:

  • 出于好奇:您为什么要尝试除法?是的,在这种情况下是一样的,但我从来没有想过用除法而不是乘法来做否定。
  • 乘法或除法无关紧要。如果对有符号整数的算术运算结果不可表示,则结果由实现定义。实现可以定义结果或发出信号。 (至少在 C99 中,参见 §6.3.1.3。)您需要查看 Microsoft 的编译器文档。
  • @Mat 它没有定义实现。这是未定义的行为:INT_MIN / -1 是未定义的行为,因为 c99 中的 6.5.5p5
  • 为什么你需要知道这个?行为是未定义的,所以你不应该首先尝试,编译器不需要给出一致的结果。

标签: c++ c compiler-construction integer


【解决方案1】:

首先让我们假设我们处于具有二进制补码表示的32-bit 系统中,其中INT_MIN 的值与-INT_MAX - 1 相同。

这个表达式:

(int) -2147483648 / (int) -1

等价于

(int) -2147483648 / -1

因为-1 已经是int 类型。

32-bit 二进制补码系统中,其中INT_MAX2147483647,值2147483648 的类型为long1),因为它不能在int 中表示. -2147483648 的值也是 long 类型。

long的值-2147483648可以用int表示,(int) -2147483648整数转换后的值为INT_MIN

那么原始表达式就等价于(在我们的假设下):

INT_MIN / -1

并且这个表达式等价于INT_MAX + 1,它不能在int 中表示。实际上int 类型范围从INT_MININT_MAX。表达式是整数溢出,整数溢出会调用 C 中未定义的行为。

(C99, 6.5p5) “如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。 "


1) 我们隐含地假设LONG_MAX> INT_MAX,否则2147483648 的值是long long 类型。

【讨论】:

  • 6.3.1.3(1): "当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新的类型表示,则保持不变。" 通常(int) -2147483648 的值不是实现定义的[超出整数类型大小和表示的实现定义],并导致INT_MIN。只有int 的宽度小于 32 位,或者表示不是二进制补码,或者符号位为 1 且所有值位为 0 的值是陷阱表示,它才能是 -2147483648 以外的其他内容。
  • @DanielFischer 天哪,我在回答的第二部分错过了重点。当然-2147483648 可以用int 表示,而且确实是INT_MIN,我不知道我在想什么。谢谢,我正在编辑。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2021-09-01
  • 2015-05-30
  • 2011-06-08
相关资源
最近更新 更多