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

soubh1k

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

我想知道为什么会这样。

安蒂·哈帕拉(Antti Haapala)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么int的范围是-32768到32767?

在Kubernetes中,为什么NodePort的默认端口范围是30000-32767?

为什么右移-1在PHP中总是给出-1?

为什么在模块part1中给出错误?

为什么Docker使用32768-65535之间的端口号?

请解释为什么我们在音频信号中使用32768

为什么read_JPEG_file()无法在C中写入图像(libjpeg / jpeg-turbo)?

为什么 Turbo C++ 在我的 Mac 上的 DOSBox 中显示此错误?

为什么我们在这个程序中需要虚拟(Turbo C++)?

为什么写作主要; 在 C 中给出段错误

为什么 ~n 给出 -(n+1)?

为什么在Mathematica中Simplify [1 / Sqrt [a] == Sqrt [1 / a]没有给出“ true”输出?

字符串范围是正确的,为什么仍然得到PLS-00215:字符串长度限制必须在范围内(1 ..32767)

MediaPlayer 流服务中的协议异常(MediaHTTPConnection:readAt 20709376 / 32768 => java.net.ProtocolException)

c语言随机生成带符号的int并填充数组,检查是否有重复,挂在32768

为什么不使用Turbo C ++编译简单的“ Hello World”风格的程序?

在Go中,为什么对于容量= 1的切片,a [1:]为什么不给出超出范围的索引错误?

为什么[]是[]在Python中给出False

为什么libonion的websockets.c示例给出错误“如果未编译gnutls,则无法计算SHA1!”

为什么调用 python 列表的 [-1] 会给出这个输出?

为什么在Python中{1} == Frozenset({1})?

C编程:为什么(0 || -1)== 1?

为什么在NOT操作的情况下C中的sizeof运算符给出不同的输出?

为什么使用命名管道会在 C 中给出随机字符?

为什么我的C ++并行程序在MPI_Gather中给出MPI致命错误?

为什么我的 for 循环没有在 C 中给出预期的输出?

为什么以下代码在C,Python中给出不同的输出?

为什么用%d打印字符变量在c中给出负值?

c,modulus(%)中的算术运算符给出警告。为什么?