当前位置: 首页 > 知识库问答 >
问题:

为什么整数在溢出[重复]时有不同的行为

宇文学博
2023-03-14

我正在阅读的一本c编程书(c编程,现代方法第2版)说,当“在对无符号整数的操作期间发生溢出时,结果是定义的”。

下面是一个小代码示例

#include <stdio.h>

int main()
{
  unsigned short int x = 65535; // The unsigned short int is at the maximum possible range
  x += 1; // If I add one to it will overflow.
  printf("%u", x); // the output will be zero or one if decide to add plus one again to x
  return 0;
}

然后他说“对于有符号整数,这些整数的行为没有定义”。这意味着程序可以打印出不正确的结果,也可以使程序崩溃。

为什么会这样?

共有1个答案

娄利
2023-03-14

它归结为硬件表示,并且有不止一种方法来表示二进制的有符号整数类型(符号大小、一补码、二补码)和对它们的操作。当发生溢出时,这些会产生完全不同的影响(例如触发硬件陷阱、使用模等)。

所有用二进制表示无符号整数值并对这些数值执行数字运算的明显方法都有相同的结果——本质上,硬件中的数字运算都与模运算一起工作。

对于基本类型(和其他东西),当有不止一种可行的实现方式时,标准通常允许编译器供应商自由,并且这些选项具有不同的后果。有符号整数类型的多种方法,以及使用每种方法的真实硬件。它们的不同足以保证行为是未定义的(因为该术语在标准中定义)。

 类似资料:
  • 未定义行为的一个例子是在flow上的整数行为 有没有一个历史的或者(甚至更好!)造成这种差异的技术原因是什么?

  • 所有,我这里有一些无法解释行为的代码。它贴在下面。我看了为什么整数溢出会导致C iostream的错误?,但它并没有真正回答我的问题。 因此,我希望这段代码所做的是读入一个整数,打印出该整数的值,读入另一个整数(到同一个变量中),然后打印出这个整数。如果我输入7和2,那么它将按预期工作。但是,如果我为第一个和第二个输入输入2^31(溢出整数1),则第一个输出将显示“x的值=-2147483648”

  • 问题内容: 在回答了这个问题之后,我很困惑为什么这段代码中的整数溢出而不是负数。奇怪,为什么这么精确的数字?为什么是0? 输出: 问题答案: 仅当的起始值为偶数时,才会发生这种情况。 根据JLS§15.17.1: 如果整数乘法溢出,则结果是数学乘积 的低阶位 ,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学积的符号不同。 如果我们以二进制格式而不是十进制

  • <代码>car\U gear字段在数据库中填写为“stick”(斗杆)。在图像标记后,输出更改为“自动” 为什么结果是$car\u result1-

  • 虚拟机安装:Ubuntu 12.04(x86) 什么是整数溢出? 存储大于最大支持值的值称为整数溢出。整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代码执行。在这篇文章中,我将仅谈论整数溢出导致堆栈溢出,整数溢出导致堆溢出将在后面的单独的帖子中讨论。 数据类型大小及范围: 当我们试图存储一个大于最大支持值的值时,我们的值会被包装 。例如,当我们尝试将存储到带

  • 问题内容: 鉴于此html: 我要填充其容器块的所有剩余垂直空间,我从这里开始: 100%的高度也是如此,这意味着它正在采用其父容器块的高度,即问题是似乎没有起作用,未被裁剪。 另一方面,如果我换行并使用另一个具有与上述相同属性的div,则将得到所需的结果: 与此HTML当然: 我的问题是为什么并且似乎具有相同属性的不同行为?没有包装,有没有办法获得相同的效果? 具有相同属性的两个jsFiddle