[英]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或任何数字。 您的程序甚至有可能崩溃或打印出威廉·莎士比亚的一首诗。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.