编译器在编译时如何检测数字溢出?

时间:2011-06-01 23:07:30

标签: c++ compiler-theory

编译器将源代码作为字符串处理,所以在C ++中,例如当它鼓励像unsigned char x = 150;这样的语句时,它从类型限制中知道unsigned char必须在0和{{1}之间的范围内}}

我的问题是数字255仍为字符串,编译器使用什么算法来比较数字序列 - 在这种情况下为150 - 与类型限制?

我为十进制,八进制,十六进制和小端二进制的类型'int'做了一个简单的算法,但我不认为编译器会这样做以检测数字中的溢出。

我制作的算法用C ++编码:

150

该算法可以优化以适用于所有整数类型,但是使用浮点数我必须使用新的算法来处理IEEE浮点表示。

我认为编译器使用有效的算法来检测除了我的溢出,不是吗?

5 个答案:

答案 0 :(得分:6)

编译器以最简单的方式处理它:它们根据需要将数字转换为整数或浮点数。没有法律规定编译器不能将字符串转换为适当的其他表示形式。

但是现在,考虑一下你原来的问题;如果你把数字和刚构建的例程视为数字呢?比如说,一个可以采用

的算法
  

6 + 5

并将总和计算为两位数字符串11?将其扩展到其他操作,您可以直接计算32769是否大于32768

答案 1 :(得分:1)

编译器在一步中将字符串表示转换为整数似乎最简单,然后在辅助步骤中与该类型的上限和下限进行比较。

我无法想象为什么比较字符串会更好。

对于花车,由于精度和圆角,问题更难。

答案 2 :(得分:0)

我不确定大多数编制者使用哪些特定算法来执行此操作,但以下是一些可行的选项:

  1. 编译器可以尝试使用现有库(例如,在C ++中,stringstream)来尝试将字符串转换为适当类型的数字。然后可以使用它来检查错误。

  2. 编译器可以将字符串转换为非常高精度的数字格式(例如,128位整数),然后检查,只要从数字文字到基本类型进行赋值,是否如果没有演员表,价值可以适合该范围。

答案 3 :(得分:0)

看到编译器无论如何都必须转换为整数/数字类型,他们也可以让他们的atoiatolatof函数在目标容量时引发错误超过了。

不需要事先对字符串进行操作,并在单独的步骤中进行转换。

我认为,最有可能的是,编译器将直接在其(高度优化的)解析器的语义操作中转换为整数类型。

答案 4 :(得分:0)

在大多数编译器理论中,程序(翻译单元)的文本被转换为标记。例如,文本“150”将转换为值为150的常量整数的标记。这当然是在预处理器运行之后。

然后编译器开始语法和语义检查的过程。因此,会针对语法(正确的拼写和格式)评估赋值语句,然后检查语义。

编译器可以抱怨超出范围的值(例如unsigned char的-150)或应用某些转换。在-150的情况下,这将被转换为8位值(指示负性的最高有效位现在是值128)。我不是语言律师,因此我不完全了解编译器在这方面的自由,也不知道是否需要警告。

总之,编译器在评估语句和检查语义时有一些自由。所有文本都转换为令牌和值的内部表示(更紧凑的数据结构)。在编译过程的语义阶段,检查是否在赋值语句的范围内使用常量整数文字。语义由语言标准或公司政策决定。一些语义转换为编译器选项,留给程序员。