如何编译C++;代码产生机器代码? 我正在使用网站学习C++。第0.5章说明编译器的目的是将人类可读的源代码翻译成机器可读的机器代码,由1和0组成

如何编译C++;代码产生机器代码? 我正在使用网站学习C++。第0.5章说明编译器的目的是将人类可读的源代码翻译成机器可读的机器代码,由1和0组成,c++,compilation,machine-code,C++,Compilation,Machine Code,我编写了一个简短的helloworld程序,并使用g++helloworld.cpp来编译它(我正在使用macOS)。结果是a.out。它确实很好地打印了“Hello World”,但是,当我尝试在vim/less/Atom/中查看a.out时,我没有看到1和0',而是看到了很多: H�E�H��X�����H�E�H�}���H��X���H9�� 为什么a.out的内容不仅仅是1和0,正如机器代码所期望的那样?它们是二进制位(1和0),但是您用来查看文件内容的任何软件都试图将它们作为人类可

我编写了一个简短的helloworld程序,并使用
g++helloworld.cpp
来编译它(我正在使用macOS)。结果是
a.out
。它确实很好地打印了“Hello World”,但是,当我尝试在vim/less/Atom/中查看
a.out
时,我没有看到1和0',而是看到了很多:

H�E�H��X�����H�E�H�}���H��X���H9��
为什么
a.out
的内容不仅仅是1和0,正如机器代码所期望的那样?

它们是二进制位(1和0),但是您用来查看文件内容的任何软件都试图将它们作为人类可读的字符而不是机器代码来读取

仔细想想,在文本编辑器中打开的所有内容都由存储在裸机上的二进制位组成。这些1和0可以用许多不同的方式解释,大多数文本编辑器都会尝试将它们作为字符读入。以字符“A”为例。它的ASCII码是65,二进制是01000001。当文本编辑器读取计算机上的文件时,它将这些位作为字符而不是机器指令进行处理,因此它在模式01000001中读取8位(字节),它知道它刚刚读取了一个“a”

这个过程会导致在可执行文件中看到的符号混乱。虽然一些内容恰好符合人类可读字符的模式,但大多数内容可能超出字符编码认为有效或知道如何打印的范围,从而导致�' 你看

我不会在这里详细介绍字符编码的工作原理,但请阅读了解更多信息。

它们是二进制位(1和0),但用于查看文件内容的任何软件都试图将它们作为人类可读的字符而不是机器码来读取

仔细想想,在文本编辑器中打开的所有内容都由存储在裸机上的二进制位组成。这些1和0可以用许多不同的方式解释,大多数文本编辑器都会尝试将它们作为字符读入。以字符“A”为例。它的ASCII码是65,二进制是01000001。当文本编辑器读取计算机上的文件时,它将这些位作为字符而不是机器指令进行处理,因此它在模式01000001中读取8位(字节),它知道它刚刚读取了一个“a”

这个过程会导致在可执行文件中看到的符号混乱。虽然一些内容恰好符合人类可读字符的模式,但大多数内容可能超出字符编码认为有效或知道如何打印的范围,从而导致�' 你看


这里我不会详细介绍字符编码的工作原理,但请阅读更多信息。

使用用于查看原始二进制文件的程序。我喜欢HxD。计算机上的所有文件都是二进制的。当你读到这篇文章时,你现在在网络浏览器上看到的一切都是二进制的。信息=数据+上下文。当您在特定程序中打开文件时,该程序会将该数据解释为预期的上下文。在atom的情况下,它需要utf-8字符。提示:您应该得到一个。另外,HxD是我在Windows上使用的。请尝试一个适合linux的答案。@JohnFilleau与您的链接帖子中所述相反,xdd没有预装在我的Mac上,我也无法通过brew安装它。然而,我可以通过hextump查看十六进制代码。编译器的目的是把人类可读的源代码翻译成机器可读的机器代码一个稍微好一点的方法是编译器的目的是把人类可读的源代码描述的可观察的行为翻译成允许编译器编译的机器可读的机码只要保持可观察的行为,就完全转换给定的代码。在某些情况下,你会发现非常长和复杂的代码可能会导致两到三条汇编指令,因为几乎所有的代码都可以在编译时解析和/或丢弃。我喜欢HxD。计算机上的所有文件都是二进制的。当你读到这篇文章时,你现在在网络浏览器上看到的一切都是二进制的。信息=数据+上下文。当您在特定程序中打开文件时,该程序会将该数据解释为预期的上下文。在atom的情况下,它需要utf-8字符。提示:您应该得到一个。另外,HxD是我在Windows上使用的。请尝试一个适合linux的答案。@JohnFilleau与您的链接帖子中所述相反,xdd没有预装在我的Mac上,我也无法通过brew安装它。然而,我可以通过hextump查看十六进制代码。编译器的目的是把人类可读的源代码翻译成机器可读的机器代码一个稍微好一点的方法是编译器的目的是把人类可读的源代码描述的可观察的行为翻译成允许编译器编译的机器可读的机码只要保持可观察的行为,就完全转换给定的代码。您会发现,在某些情况下,非常长和复杂的代码可能会导致两个或三个汇编指令,因为几乎所有的代码都可以在编译时解析和/或丢弃。感谢您的帮助!我有两个后续问题:1)如果说三个文件包含源代码、汇编代码和机器代码,它们都是1和0,但只有机器代码1对CPU“有意义”,这是否正确?(意思是它知道该做什么)2)你能推荐一种方法来查看