当我在Turbo C的整数变量中将32767添加到1时,我得到-32768,而我应该得到32768。
我想知道为什么会这样。
答案 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或任何数字。你的节目甚至有可能崩溃或打印威廉莎士比亚的一首诗。