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

本文关键字:之间 转换 类型 计算机 | 更新日期: 2023-09-27 17:50:45

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

例如,它如何从字符串中提取int?

我的理论是,字符串的核心是一个char数组,因此它会逐个索引,并根据ascii表进行检查。如果它落在int的范围内,则它被添加到整数中。它发生在比这更低的水平上吗?是否正在进行比特屏蔽?这是怎么发生的?

免责声明:不适合上学,只是好奇。

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

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

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

int为float,反之亦然

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

字符串到整数类型

从字符串到整数的转换相当简单,因为不会发生数字错误。事实上,任何字符串都只是一个代码点序列(可以用charwchar_t表示,也可以不表示(,处理这一问题的常用方法如下:

unsigned 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;
}

如果你想考虑额外的碱基(例如,像0x123这样的字符串作为十六进制表示(或负值,它可能需要更多的测试,但基本算法保持不变。

int到字符串

正如预期的那样,这基本上是相反的:一个实现总是将除法的余数除以10,然后再除以10。由于这将以相反的方式给出数字,因此可以从后面打印到缓冲区中,也可以再次反转结果。

字符串到浮点类型

将字符串解析为double(或float(要复杂得多,因为转换应该以尽可能高的精度进行。这里的基本思想是将数字读取为一串数字,同时只记住点在哪里以及指数是什么。然后,你可以根据这些信息(基本上是53位整数(和指数组合尾数,并为生成的数字组合实际的位模式。然后,这将被复制到您的目标值中。

虽然这种方法运行得很好,但实际上有几十种不同的方法在使用,它们在性能、正确性和稳健性方面都有所不同。

实际实施

请注意,实际的实现可能需要做一件更重要(而且非常丑陋(的事情,那就是语言环境。例如,在德语区域设置中,","是小数点,而不是千分隔符,因此圆周率大致为"31415926535"。

Perl字符串加倍
TCL字符串加倍
大卫M.盖伊AT&T纸字符串到双,双到字符串和源代码
Boost Spirit