gcc 输出文件是什么样的,它究竟包含什么?

What does a gcc output file look like and what exactly does it contain?

在编译一个c文件时,gcc默认将它编译成一个名为“a.out”的文件。我的教授说输出文件包含二进制文件,但是当我打开它时,我通常会遇到不可读的文本(VS Code 说类似“此文件包含不受支持的文本编码”)。
我假设到 'binaries',我将能够在文件中看到文字零和一,但情况似乎并非如此。那么它的输出文件到底是什么样子,或者它到底包含什么,什么是 'text encoding'?为什么我不能阅读呢?它可能包含哪些特殊字符?我知道 gcc 首先进行预处理,这意味着它会删除所有注释、展开所有宏并复制可能包含的任何头文件的内容。你通过运行gcc -E <file_name>.c得到头文件,然后将这个处理后的文件编译成汇编。到目前为止,输出文件是可读的,也就是说,我可以用 VS Code 打开它们,但在此之后组装的代码和之后的目标文件是 human-unreadable.

作为参考,我以前没有编程或任何语言方面的经验,这是我大学第一学期的第一门 CS 相关课程,如果这个问题太琐碎,我深表歉意。

其实我很早就有过同样的困惑。不是具体的文件类型,而是二进制文件和文本文件。

毕竟不是所有文件,甚至文本文件都是二进制文件吗?从某种意义上说,所有信息都是 1s 和 0s?好吧,是的,所有信息都可以 stored/transmitted 作为 1s 和 0s,但这不是 binary/text 文件所指的。

指的是那个信息,文件的内容,10代表什么。

在文本文件中,字节编码字符。在二进制文件中,位编码一些非文本信息。该信息的格式和语义是完全自由的,它可以表示任何含义并使用任何编码方案。 writes/reads 文件正确理解位模式取决于应用程序。

大多数文本编辑器(如 VS Code)在打开文件时将其视为文本文件。 IE。他们试图将位模式解释为文本编码方案(例如 ASCII 或 UTF-8)但并非所有位模式都有效 ASCII/UTF-8 所以这就是为什么你得到“不受支持的文本编码”。

如果您想检查文本和二进制文件的实际 10,您需要使用一个实用程序来向您显示,例如十六进制 viewers/editors.