计算机如何将一切翻译成二进制?当他们看到二进制代码时,他们如何知道它是代表数字还是单词或指令?

时间:2014-10-08 21:49:34

标签: binary computer-science binaryfiles binary-data computer-architecture

我知道计算机如何将数字转换为二进制数。但我不明白的是,我听说计算机将所有内容(文字,说明,......)翻译成二进制文件,而不仅仅是数字。这怎么可能?

你能告诉我一些例子吗?就像计算机如何将字母“A”翻译成二进制文件一样?

当计算机看到二进制代码时,他们如何知道0和1的长字符串是代表数字还是单词或指令?

例:

假设计算机程序员编码字母“Z”,以便将其转换为此二进制字符串:11011001111011010111

因此,当计算机遇到这个二进制字符串时,它会将其转换为字母“Z”。

但是当我们问这台电脑“到1259年709的产品是什么时,会发生什么?”

电脑会回答我们“892631”。但是这个数字在翻译成二进制时是11011001111011010111。

那么它如何在“Z”和“892631”之间产生差异?

请注意,我对计算机科学知之甚少,所以请用简单的术语解释一切。

5 个答案:

答案 0 :(得分:9)

计算机实际上并没有将任何内容翻译成二进制文件,它从一开始就是二进制文件,而计算机从不知道二进制文件以外的任何内容。

存储在内存中的字符A将为01000001,并且计算机不会将其视为二进制数字。当我们要求计算机将该数字显示为屏幕上的字符时,它将在字体定义中查找它的图形表示,以找到要发送到屏幕硬件的其他二进制数字。

例如,如果计算机是8位Atari,它会找到八个二进制值来表示屏幕上的字符A

00000000
00011000
00111100
01100110
01100110
01111110
01100110
00000000

正如您所看到的,当图形硬件在屏幕上绘制时,二进制值将转换为暗和亮像素。

同样,无论我们如何处理计算机中的数字,都可以通过移动二进制值,对二进制值进行计算以及将它们转换为其他二进制值的方式进行。

例如,如果您使用A的字符代码并希望将其显示为十进制数,则计算机将计算该数字的十进制表示形式为数字6(110)和5(101),将其转换为字符600110110)和字符500110101),然后将其转换为图形表示

答案 1 :(得分:7)

这是一个很好的问题,需要花费数年的时间,以及几位博士才能完全解释。我可以为您提供一个简单的答案,但要完全理解您将需要做更多的研究。我可以建议麻省理工学院提供一些免费的在线课程here

在最低级别,字母A和数字65实际上使用0和1的相同序列存储。 1000001,如果我没有弄错的话。

然后计算机决定从内存中抓取它时的内容。这意味着字母可以显示为数字,反之亦然。

计算机知道它正在寻找什么的方式是程序员告诉它它在寻找什么。程序员说我想要一个存储在这样一个位置的号码,然后计算机就会查找它。

让我们提升一个级别,因为很少有程序在这么低的级别上编程。其他程序(通常编译器采用像C ++这样的代码并将其转换为计算机可以理解的东西)确保我们访问的位置实际上就是我们所说的。它们有额外的信息告诉他们这个特定的1和0组实际上是一个浮点类型(有一个小数点),而这个集合是整数(没有小数点)

然后其他类型构建在这些类型,更大的整数或浮点或字符串上,并且编译器再次强制执行类型。

这是一个过于简单化,我意识到这里的一切都不完全正确,但它会让你走上正确的道路。您可以查看其中一些主题以获得更好的想法:

How instructions are differentiated from data?

http://en.wikipedia.org/wiki/Computer_data_storage

How is data, address and Instruction differentiated in Processor/Register/memory?

http://en.wikipedia.org/wiki/Reference_(computer_science)

希望这会让事情变得清晰起来。随意请求澄清!

答案 2 :(得分:5)

So how would it make a difference between "Z" and "892631"?

它没有。对于计算机,一切都是0和1。他们的原始位没有任何意义,直到处理器告诉他们如何处理那些0和1!

例如,我可以创建变量x并使其值0b01000001(0b表示"这是我在二进制文件中描述的数字")。然后我可以让处理器为我打印变量x到屏幕上。但我首先必须告诉处理器x是什么!

printf("%d", x); // this prints the decimal number 65

printf("%c", x); // this prints the character A

所以除了原始位x之外,01000001本身并不意味着什么。但作为程序员,我的工作就是告诉计算机x的真正意义。

答案 3 :(得分:1)

计算机仅使用7位来存储字母/特殊字符,而在存储数字时则使用字节的所有8位。

让我们以“ A”和“ 65”为例。

65/2-QUO是32,提醒是1 1 2到0的幂是1

32/2现行为16,提醒为0 01

16/2现行为8,提醒为0 001

8/2现行为4,提醒为0 0001

4/2现行为2,提醒为0 00001

2/2现行为1,提醒为0 1000001 2到6的幂为64

                             =========
                             1000001 binary repressents 65

字母A的ASCII值以二进制格式存储为01000001(仅使用7位,而第8位则用0存储字母和特殊字符)。

我希望这会有所帮助。

答案 4 :(得分:1)

让我们在这里讨论一些基本知识:

  1. 假设您的硬盘只是圆形的铝板,并且整个表面都有小孔/斑点(只能使用显微镜才能看到)。点是一个按字节分组的小孔-8位(1位是1孔)。
  2. RAM与硬盘驱动器相似,但它是由硅制成的半导体,因此它可以电场形式存储信息,并且每个字节都有地址,因此速度更快。
  3. 计算机将您在硬盘驱动器中通过键盘输入的所有信息存储为称为1的电磁脉冲(代表人类理解为1)。如果没有信息,则该斑点(一个小孔)为空,称为零。 li>

让我们讨论您的问题的第一部分-您能给我看看一些例子吗?就像计算机如何将字母“ A”转换为二进制?

  1. 例如,您通过键盘输入字符“ A”和“அ”。
  2. 字符“ A”在Unicode / ASCII中表示为65,在基数2二进制中为01000001。操作系统执行A到Binary的映射。您输入的字符“ A”现在以01000001的形式存储在硬盘中,并且会出现在8个不同的位置(例如,对于最左边的数字0,没有磁脉冲,对于第七位中的7,磁脉冲等)。
  3. 对于RAM,它以电脉冲的形式存储信息,因此,在关闭电源时,RAM会丢失所有信息。

现在,在RAM或HardDrive上看到的所有内容在给定的字节中都是能量或没有能量,因此我们将其称为二进制格式以供人类理解(我们将其称为0表示无能量,将其称为1表示能量)。

现在由编译器决定如何存储它。如果它是AMD处理器/ Windows OS上的C编译器,则它将值存储在2个字节中(一个字节为5,一个字节为6)。如果它是AMD处理的,则存储值5的字节将位于6的右侧-称为低端字节序。 C程序不支持字符“அ”,因为它需要超过1个字节来存储国际字符。

如果它是Java编译器,它将使用称为UTF-16的4字节可变长度。对于字母“ A”,由于Unicode / ASCII表示为65,所以需要1个字节。而如果存储的是国际语言字符,例如“அ”(泰米尔语中的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会根据执行指令来知道什么寄存器用于什么。

希望这会有所帮助。