编译器将源代码作为字符串处理,所以在C ++中,例如当它鼓励像unsigned char x = 150;
这样的语句时,它从类型限制中知道unsigned char
必须在0
和{{1}之间的范围内}}
我的问题是数字255
仍为字符串,编译器使用什么算法来比较数字序列 - 在这种情况下为150
- 与类型限制?
我为十进制,八进制,十六进制和小端二进制的类型'int'做了一个简单的算法,但我不认为编译器会这样做以检测数字中的溢出。
我制作的算法用C ++编码:
150
该算法可以优化以适用于所有整数类型,但是使用浮点数我必须使用新的算法来处理IEEE浮点表示。
我认为编译器使用有效的算法来检测除了我的溢出,不是吗?
答案 0 :(得分:6)
编译器以最简单的方式处理它:它们根据需要将数字转换为整数或浮点数。没有法律规定编译器不能将字符串转换为适当的其他表示形式。
但是现在,考虑一下你原来的问题;如果你把数字和刚构建的例程视为数字呢?比如说,一个可以采用
的算法
6
+5
并将总和计算为两位数字符串11
?将其扩展到其他操作,您可以直接计算32769
是否大于32768
。
答案 1 :(得分:1)
编译器在一步中将字符串表示转换为整数似乎最简单,然后在辅助步骤中与该类型的上限和下限进行比较。
我无法想象为什么比较字符串会更好。
对于花车,由于精度和圆角,问题更难。
答案 2 :(得分:0)
我不确定大多数编制者使用哪些特定算法来执行此操作,但以下是一些可行的选项:
编译器可以尝试使用现有库(例如,在C ++中,stringstream
)来尝试将字符串转换为适当类型的数字。然后可以使用它来检查错误。
编译器可以将字符串转换为非常高精度的数字格式(例如,128位整数),然后检查,只要从数字文字到基本类型进行赋值,是否如果没有演员表,价值可以适合该范围。
答案 3 :(得分:0)
看到编译器无论如何都必须转换为整数/数字类型,他们也可以让他们的atoi
,atol
,atof
函数在目标容量时引发错误超过了。
不需要事先对字符串进行操作,并在单独的步骤中进行转换。
我认为,最有可能的是,编译器将直接在其(高度优化的)解析器的语义操作中转换为整数类型。
答案 4 :(得分:0)
在大多数编译器理论中,程序(翻译单元)的文本被转换为标记和值。例如,文本“150”将转换为值为150的常量整数的标记。这当然是在预处理器运行之后。
然后编译器开始语法和语义检查的过程。因此,会针对语法(正确的拼写和格式)评估赋值语句,然后检查语义。
编译器可以抱怨超出范围的值(例如unsigned char
的-150)或应用某些转换。在-150的情况下,这将被转换为8位值(指示负性的最高有效位现在是值128)。我不是语言律师,因此我不完全了解编译器在这方面的自由,也不知道是否需要警告。
总之,编译器在评估语句和检查语义时有一些自由。所有文本都转换为令牌和值的内部表示(更紧凑的数据结构)。在编译过程的语义阶段,检查是否在赋值语句的范围内使用常量整数文字。语义由语言标准或公司政策决定。一些语义转换为编译器选项,留给程序员。