我知道计算机如何将数字转换为二进制数。但我不明白的是,我听说计算机将所有内容(文字,说明,......)翻译成二进制文件,而不仅仅是数字。这怎么可能?
你能告诉我一些例子吗?就像计算机如何将字母“A”翻译成二进制文件一样?
当计算机看到二进制代码时,他们如何知道0和1的长字符串是代表数字还是单词或指令?
例:
假设计算机程序员编码字母“Z”,以便将其转换为此二进制字符串:11011001111011010111
因此,当计算机遇到这个二进制字符串时,它会将其转换为字母“Z”。
但是当我们问这台电脑“到1259年709的产品是什么时,会发生什么?”
电脑会回答我们“892631”。但是这个数字在翻译成二进制时是11011001111011010111。
那么它如何在“Z”和“892631”之间产生差异?
请注意,我对计算机科学知之甚少,所以请用简单的术语解释一切。
答案 0 :(得分:9)
计算机实际上并没有将任何内容翻译成二进制文件,它从一开始就是二进制文件,而计算机从不知道二进制文件以外的任何内容。
存储在内存中的字符A
将为01000001
,并且计算机不会将其视为二进制数字。当我们要求计算机将该数字显示为屏幕上的字符时,它将在字体定义中查找它的图形表示,以找到要发送到屏幕硬件的其他二进制数字。
例如,如果计算机是8位Atari,它会找到八个二进制值来表示屏幕上的字符A
:
00000000
00011000
00111100
01100110
01100110
01111110
01100110
00000000
正如您所看到的,当图形硬件在屏幕上绘制时,二进制值将转换为暗和亮像素。
同样,无论我们如何处理计算机中的数字,都可以通过移动二进制值,对二进制值进行计算以及将它们转换为其他二进制值的方式进行。
例如,如果您使用A
的字符代码并希望将其显示为十进制数,则计算机将计算该数字的十进制表示形式为数字6(110
)和5(101
),将其转换为字符6
(00110110
)和字符5
(00110101
),然后将其转换为图形表示
答案 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)
让我们在这里讨论一些基本知识:
让我们讨论您的问题的第一部分-您能给我看看一些例子吗?就像计算机如何将字母“ A”转换为二进制?
现在,在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会根据执行指令来知道什么寄存器用于什么。
希望这会有所帮助。