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

时间:2016-04-07 09:46:26

标签: c int turbo-c

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

我想知道为什么会这样。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

整数溢出调用未定义的行为。因此结果可以是-32768,32768,0或任何数字。你的节目甚至有可能崩溃或打印威廉莎士比亚的一首诗。