【问题标题】:Why 32767+1 gives -32768 in Turbo C?为什么 32767+1 在 Turbo C 中给出 -32768?
【发布时间】:2016-04-07 09:46:25
【问题描述】:

当我在 Turbo C 的整数变量中将 32767 添加到 1 时,我得到 -32768 而我应该得到 32768。

我想知道为什么会这样。

【问题讨论】:

  • 16 位整数溢出。
  • 有符号整数溢出无论如何都是 UB。
  • 这是 未定义的行为,因为有符号整数溢出(您的 int 是 16 位宽的 2 的补码)。请注意,当溢出 16 位有符号整数时,您甚至可能在其他平台上得到 32768。
  • @Nick 不,那不是合适的地方。它只是说明了 Turbo C 中int 的范围。

标签: c int turbo-c


【解决方案1】:

32767 和 1 都适合 int,因此它们是 int 类型的常量。在 Turbo C 中,int 的范围为 -32768 到 32767(它们是 16 位 2 的补码有符号整数)。当您将int 添加到int 时,两边都没有促销,结果也是int 类型。但是 32767 + 1 在签名的int 中不可表示 - 它超出了类型的限制。这称为有符号整数溢出。

根据 C 标准,当发生有符号整数溢出时,程序的行为是未定义的。在这种情况下,它将值包装起来;例如当您将1 添加到0b0111111111111111 时,您将得到0b1000000000000000,它被解释为-32768

但是,C 标准不要求对有符号整数溢出进行任何回绕——任何事情都可能发生。你的程序甚至可以表现得像结果是正的 32768(即使不能用 16 位 int 表示 - 这实际上在 32 位和 64 位处理器上很可能 - 编译器知道 因为数字永远不会溢出,编译器可以使用更宽的寄存器)。或者你的程序可能会因为异常而崩溃,或者它可能会导致恶魔从你的鼻子里飞出来。

【讨论】:

    【解决方案2】:

    整数溢出会调用未定义的行为。所以结果可以是 -32768、32768、0 或任何数字。您的程序甚至有可能崩溃或打印出威廉·莎士比亚的一首诗。

    【讨论】:

    • Turbo C 是 C 和其他 C 是 C 一样多
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2012-05-03
    • 1970-01-01
    • 2010-11-11
    • 2011-04-24
    相关资源
    最近更新 更多