当我在Turbo C的整数变量中将32767加到1时,我得到-32768,而我应该得到32768。
我想知道为什么会这样。
32767和1都适合于int
,因此它们是type常量int
。在Turbo Cint
中,范围是-32768到32767(它们是16位2的补码有符号整数)。将anint
加到时int
,两边都没有促销,结果也将是type int
。但是,32767 + 1不能用带符号表示int
-它超出了类型的限制。这称为有符号整数溢出。
根据C标准,当有符号整数溢出发生时,程序的行为是不确定的。在这种情况下,它将值包装起来;例如,当您添加1
到时0b0111111111111111
,您将得到0b1000000000000000
,它被解释为-32768
。
但是,C标准不要求对有符号整数溢出进行任何环绕操作-可能会发生任何事情。您的程序甚至可以表现为结果为正32768(即使不能用16位表示)int
-实际上在32位和64位处理器上很可能会出现这种情况-编译器知道,由于数字永远不会溢出,编译器可以为其使用更大的寄存器)。否则您的程序可能会因异常而崩溃,或者可能导致恶魔从您的鼻子中飞出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句