计算机如何在类型之间进行转换

时间:2014-03-18 15:40:26

标签: c# c++ compiler-construction low-level

所以你在SO上看到的一个常见问题是如何在类型x和类型z之间进行转换,但我想知道计算机是如何做到这一点的?

例如,如何从字符串中取出一个int?

我的理论是,字符串在其核心是一个char数组,因此它按索引进行索引并根据ascii表进行检查。如果它落在整数范围内,则将其添加到整数。它是否发生在比这更低的水平?有掩码发生吗?这是怎么发生的?

免责声明:不是为了学校,只是好奇。

1 个答案:

答案 0 :(得分:1)

只有在将类型限制为有些可管理的子集时,才能回答此问题。为此,让我们考虑三种有趣的类型:字符串,整数和浮点数。

唯一真正不同的基本类型是指针,它通常不会以任何有意义的方式转换(即使NULL检查实际上不是转换,而是{{1}的特殊内置语义文字)。

int to float,反之亦然

将整数转换为浮点数反之亦然,因为现代CPU提供了直接处理该情况的指令。

字符串到整数类型

从字符串到整数的转换非常简单,因为不会发生数字错误。实际上,任何字符串只是一系列代码点(可能由0char表示,也可能不由wchar_tunsigned result = 0; for(size_t i = 0; i < str.size(); ++i) { unsigned c = str[i] - static_cast<unsigned>('0'); if(c > '9') { if(i) return result; // ok: integer over else throw "no integer found"; } if((MAX_SIZE_T - c) / 10 < result) throw "integer overflow"; result = result * 10 + c; } 表示),通过此方法的常用方法如下:< / p>

0x123

如果你想考虑其他基础(例如像double这样的字符串作为十六进制表示)或负值,它显然需要更多的测试,但基本算法保持不变。

int to string

正如预期的那样,这基本上是相反的:一个实现总是将除法的余数除以10,然后除以10.由于这将反向提供数字,可以从后面打印到缓冲区或再次扭转结果。

字符串到浮点类型

将字符串解析为float(或{{1}})要复杂得多,因为转换应该以尽可能高的准确度发生。这里的基本思想是将数字作为一串数字读取,同时只记住点的位置和指数是什么。然后,您将根据此信息(基本上是53位整数)和指数组装尾数,并汇总结果数字的实际位模式。然后将其复制到您的目标值中。

虽然这种方法非常精细,但实际上有几十种不同的方法在使用,所有这些方法在性能,正确性和稳健性方面都有所不同。

实际实施

请注意,实际的实现可能需要做一个更重要(而且非常丑陋)的事情,即locale。例如,在德语区域设置中,“,”是小数点而不是数千个分隔符,因此pi大致为“3,1415926535”。

Perl string to double
TCL string to double
David M. Gay AT&T Paper string to double, double to string and source code
Boost Spirit