例如,如果我打字:
-6
通过哪种机制变成:
1010
是基于硬件还是内核?
是基于硬件还是在内核中?
通常没有,没有。
像Linux这样的主流OS中的内核通常只会传递文本字节到用户空间。
因此,一个用户空间程序获得了一个字符串,即字符序列。(在简单的情况下,例如,UTF-8的ASCII子集,每个字符都是一个字节。)程序通常会使用诸如atoi()
之类的函数将字符序列(代表ASCII代码数字代码)转换为二进制整数。这是标准库功能,因为许多程序需要处理代表整数的字符串,但是它像其他任何其他程序一样。
一个简单的实现将具有
之类的循环int sum = 0;
for (auto d: digits) { // look at digits in MSB-first order
sum = 10*sum + d;
}
// the first digit ends up being multiplied by 10 n times
// the 2nd by 10 n-1 times, and so on. Each digit is multiplied by its place value.
此C 源将被编译为实现它的多个ASM指令。通过否定处理可选的-
也是单独的指令。通常有某种neg
指令,或从零开始减去2的方法,以使2的补体倒数。(假设2的补充硬件)。
您可以使用每次指令/每个时钟周期进行更多工作的较高的说明加快此操作。例如,在x86上,您可以将多位数字字符串转换为带有几个SIMD指令的二进制整数,但这仍然只是使用乘法并添加指令。查看如何使用SIMD实现ATOI?为了很好地利用pmaddwd
乘以位置值的向量并水平添加。从字符串获取IPv4地址的最快方法也是您可以通过该比较结果从表中从表中查找pshufb
Shuffle-Control Vector的很酷的示例。
像 scanf("%d", &num)
这样的函数读取输入为一个数字在用户空间中实现,但是在引擎盖下,它使用诸如 read()
之类的系统调用来获取数据。(如果C stdio输入缓冲区为空。)
MARS和SPIM MIPS模拟器(例如MARS和SPIM MIPS模拟器)的一些"玩具"/教学系统具有获取或打印整数的系统呼叫(带有输入或导致整数寄存器)。在这种情况下,是的,内核可以在软件中进行。
或取决于实现的不同,实际上根本没有内核,syscall
指令逃脱到模拟器/模拟器的输入/输出函数,因此,从该虚拟模拟机中运行的软件的POV中,硬件支持整数转换。但是,没有真正的硬件在Microcode或实际硬件中可以完成整个内容,至少没有任何主流体系结构。