【问题标题】:why minimum possible integer minus one becomes maximum possible integer in c为什么最小可能整数减一成为c中的最大可能整数
【发布时间】:2021-11-23 09:01:09
【问题描述】:

我知道 c 在二进制补码中工作,但我仍然无法理解下面的程序如何给我 2147483647 作为输出。

#include<stdio.h>
int main(){

int a=-2147483648;
a-=1;
printf("%d",a);

}

【问题讨论】:

  • 我认为这是因为您使用和打印整数(这是一种无符号数据类型)而不是有符号整数。
  • 有趣的是,search query 在 Stack Overflow 上为这个 特定 号码提供了超过 14.000 个结果,但您找不到任何有用的答案。
  • 这能回答你的问题吗? why does long long 2147483647 + 1 = -2147483648?

标签: c


【解决方案1】:

因为int 不能包含值-2147483648 - 1,所以它会导致整数溢出,从而导致未定义的行为。未定义的行为可能导致任何结果。

【讨论】:

  • 未定义的行为不会导致任何结果。当行为未由 C 标准定义时,则任何行为都符合 C 标准。但是这种行为仍然受到其他约束的限制,包括逻辑、物理、定律以及制造、软件架构等强加的特性。例如,整数溢出不会导致一般市场计算机着火。特别相关的是编译器设计和处理器架构对程序行为有巨大影响的事实,即使 C 标准没有定义行为……
  • ... 了解这些影响对于通过观察程序行为来诊断程序中的错误非常有帮助。当有一个程序时,由于编译器构造和处理器设计的性质,程序在很大程度上以可预测的方式出现异常。理解这有助于调试程序。因此,告诉人们“未定义的行为可能导致任何结果”是一种伤害。
【解决方案2】:

二进制补码的最小数字是 100000...0 如果您从中减少一个,则意味着计算机将添加-1 -1 的二进制补码是:11111...1 所以如果你添加它们,答案是 0111111...1 这是最大整数或 2147483647

【讨论】:

  • 这在谈到纯数学或汇编指令时是正确的,但在谈到这里没有可预测行为的 C 时则不然。所以这个答案在 C 的上下文中是不正确的。
  • @Lundin:这个答案在“C 的上下文中”或其他方面都不是错误的。问题询问程序如何给出 2147483647 作为输出,而不是 C 标准是否定义了它。二进制补码表示换行的事实从根本上说是程序以它的方式运行的原因,所以这个答案确实回答了所提出的问题。最好还提到这种行为不是由 C 标准定义的,并且在其他情况下可能会失败,例如启用优化时,但答案是正确的。
  • @EricPostpischil 默默地假装代码很好并且定义明确,但实际上并没有给任何人带来任何好处。这正是你教初学者糟糕和不正确的编程实践的方式。
  • @Lundin:我们不必“默默地假装”代码定义明确来解释程序为什么会产生它所做的行为。您关于什么是好或坏的意见事实没有影响,即该答案说明了程序行为方式的原因。如果你想说这个答案应该解释行为是未定义的,那好吧。如果你说这个答案不正确,那么你的陈述就是错误的。
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-08-22
  • 2021-06-06
  • 2017-10-14
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多