让我们在这里讨论一些基础知识:
- 假设您的硬盘驱动器只是一个圆形的铝板,并且到处都有小孔/斑点(只能使用显微镜才能看到)。 Spot是一个按字节分组的小洞——8位(1位就是1个洞)。
- RAM 类似于硬盘驱动器,但它是由硅制成的半导体,因此它可以以电场的形式存储信息,并且每个字节都有地址,因此速度更快。
- 计算机将您通过键盘输入的所有信息存储在硬盘驱动器中作为磁脉冲(表示为 1 以供人类理解)称为 1。如果没有信息,则该点(一个小孔)是空的,称为零。李>
让我们讨论你问题的第一部分 - 你能给我看一些例子吗?比如计算机如何将字母“A”翻译成二进制?
- 例如,您通过键盘输入字符“A”和“அ”。
- 字符“A”在 Unicode/ASCII 中表示为 65,在 base 2 二进制中是 01000001。操作系统将 A 映射到二进制。您输入的这个字符“A”现在作为 01000001 存储在硬盘中,并将出现在 8 个不同的位置(如最左边的数字 0 没有磁脉冲,第七位的 7 有磁脉冲等)。
- 在 RAM 的情况下,它以电脉冲的形式存储信息,因此当电源关闭时 RAM 会丢失所有信息。
现在,您在 RAM 或硬盘驱动器上看到的所有内容在给定字节中都是能量或没有能量,我们将其称为二进制格式以供人类理解(我们将其称为 0 表示没有能量,1 表示能量)。
现在取决于编译器,它必须如何存储。如果它是 AMD 处理器/Windows 操作系统上的 C 编译器,它会将值存储在 2 个字节中(5 个字节一个字节,6 个字节一个字节)。如果是 AMD 处理,存储值 5 的字节将位于 6 的右侧 - 它称为低端。 C 程序不支持字符“அ”,因为它需要超过 1 个字节来存储国际字符。
如果它是 Java 编译器,它使用称为 UTF-16 的 4 字节可变长度。对于字母“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 现在知道什么寄存器是什么,基于它执行你的指令。
希望这会有所帮助。