编译C ++代码如何产生机器代码?

问题描述

我正在使用learncpp.com网站学习C ++。第0.5章指出,编译器的目的是将人类可读的源代码转换为机器可读的机器代码,该机器代码由1和0组成。

我编写了一个简短的hello-world程序,并使用g++ hello-world.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'。 / p>

此过程导致在可执行文件中看到的符号混乱。虽然某些内容碰巧是使人类可读的字符的正确模式,但其中大多数可能会超出字符编码认为有效或不知道如何打印的范围,从而导致您看到``...''。

我不会在这里复杂地讨论字符编码的工作原理,但请阅读Character Encodings for Beginners以获得更多信息。