繁体   English   中英

为什么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或任何数字。 您的程序甚至有可能崩溃或打印出威廉·莎士比亚的一首诗。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM