为什么 32767+1 在 Turbo C 中给出 -32768?

Why 32767+1 gives -32768 in Turbo C?

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

我想知道为什么会这样。

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 位处理器上很有可能 - 编译器知道 因为数字永远不会溢出,编译器可以为它使用更宽的寄存器)。或者你的程序可能会异常崩溃,或者它可能会导致你的鼻子飞出来。

整数溢出调用未定义的行为。因此结果可以是 -32768、32768、0 或任何数字。您的程序甚至有可能崩溃或打印 Willian Shakespeare 的一首诗。