让我们先讨论一些基础知识:
1. 假设你的硬盘只是一个铝制圆形板,上面有许多微小的孔洞/斑点(只能在显微镜下看到)。每个斑点都是由8位组成的字节组合而成的小孔洞(1位是1个孔洞)。
2. RAM类似于硬盘,但它是由硅制成的半导体,因此可以将信息存储为电场,并为每个字节分配地址,因此速度更快。
3. 计算机将您通过键盘输入的所有信息存储在硬盘中,以磁脉冲的形式表示(用1表示),如果没有信息,则该点(一个微小的孔洞)为空,称为0。
现在让我们来讨论您问题的第一部分 - 您能给我展示一些例子吗?比如计算机如何将字母“A”转换为二进制?
4. 例如,您通过键盘输入字符'A'和'அ'。
5. 字符'A'在Unicode / ASCII中表示为65,即二进制的01000001。操作系统将A映射到二进制。您输入的这个字符'A'现在以01000001的形式存储在硬盘中,并将出现在8个不同的位置(例如,在第七位中,左侧数字0没有磁脉冲,第7位有磁脉冲等)。
6. 在RAM的情况下,它以电脉冲的形式存储信息,因此当电源关闭时,RAM会丢失所有信息。
现在,您在RAM或硬盘上看到的所有内容都是给定字节中的能量或无能量,并且我们将其称为二进制格式(让我们将其称为0表示无能量,1表示有能量)。
现在由编译器决定如何存储。如果是AMD处理器/Windows操作系统上的C编译器,则将值存储在2个字节中(一个字节为5,一个字节为6)。存储值为5的字节将在6的右侧(如果是AMD处理),这被称为低端序。C程序不支持字符'அ',因为需要多于1个字节来存储国际字符。
如果是Java编译器,则使用长度可变的4个字节,称为UTF-16。对于字母'A',只需1个字节即可,因为Unicode / ASCII表示为65。而如果要存储国际语言字符(例如泰米尔语中的A类似的'அ'),则相应的Unicode值为2949,相应的二进制值为11100000 10101110 10000101(3个字节)。Java可以轻松存储和读取'A'和'அ'。
现在想象一下,您使用Java / Windows / AMD处理器将字符'அ'作为类型字符(Char)存储在硬盘中。
现在想象一下,您想使用C程序作为Char读取此内容。 C编译器仅支持ASCII而不是完整的Unicode集。在这里,C将读取上述3个字节的最右侧(10000101)字节(对于char类型,它会读取1个字节),屏幕上会显示什么?如果您要求程序打印,您的C程序将读取此1个字节而不会出现任何问题,并在屏幕上绘制此�。因此,编译器是区别制造者。
现在让我们讨论您问题的第二部分:当计算机看到二进制代码时,它们如何知道那长串0和1代表数字、单词或指令?
现在,您正在将已编译的Java程序加载到RAM的文本和数据区域中(在高级别上,RAM被分成文本和数据区域)。现在,您要求处理器的ALU执行您的程序的一组指令,称为进程。
您已编译程序中的行是将数据从一个变量移动到另一个变量的指令。
当ALU执行第一个指令时,它进入RAM外部的相应寄存器。处理器具有用于数据和指令的一组寄存器。根据这个,ALU现在知道哪个寄存器是什么,然后执行您的指令。
希望这有所帮助。