繁体   English   中英

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

[英]How does compiling C++ code produce machine code?

我正在使用网站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”。

此过程会导致您在可执行文件中看到的符号混乱。 虽然某些内容恰好采用正确的模式来制作人类可读的字符,但其中大部分内容可能不在字符编码认为有效或知道如何打印的范围之外,从而导致您看到的“�”。

我不会 go 深入了解字符编码的工作原理,但请阅读 面向初学者的字符编码以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM