assembly 编译过程为预处理-编译-汇编-链接,其中“A”跟随ASCII码或Unicode码,将A转换为65

5lwkijsr  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(128)
#include <stdio.h>

int main(void) {
printf("A");
}

语言的保留关键字int是否也遵循ASCII或Unicode字符集。是否将其拆分为单个字符以转换为二进制?

wqlqzqxt

wqlqzqxt1#

源文件的字符集是由实现定义的。许多常见的编译器系统使用ASCII,有些甚至使用Unicode,但C标准没有要求特定的字符集。
这是C标准指定的第一个转换阶段:
1.如有必要,物理源文件多字节字符将以实现定义的方式Map到源字符集(为行尾指示符引入换行符)。
C标准的第5.2.1章区分了 * 源字符集 * 和 * 执行字符集 。它们都没有定义为特定的字符集。
www.example.com一章5.1.1.2定义了几个转换阶段,其中第四个阶段执行所有预处理器指令,从而完成预处理。
这是第五阶段:
1.字符常量和字符串文字中的每个源字符集成员和转义序列都将转换为执行字符集的相应成员;如果没有Map的成员,则会将它转换为实作定义的成员,而不是null(宽)字符。
因此,您的标题问题可以回答为“编译器将字符从源字符集转换为执行字符集”。
实际上有不同字符集的编译器。例如,z88dk使用一个目标特定的执行字符集,它不一定是ASCII,但接受ASCII源文件。
不过,这种转换只会发生在字符常数和字串常值。
关键字不受影响。预处理程序在源字符集的编码中处理它们,并且永远不会将它们转换为任何其他字符集。此源字符集 * 可以 * 是ASCII或UTF-8,但特定的字符集是由实现定义的。
1.源文件被分解为预处理标记和空白字符序列(包括注解)。
[...]*
这样的标记 * 可以 * 通过某个整数常量或枚举成员,或者开发人员认为合适的任何其他方式来实现。
关于您提到的“binary":计算机中的任何东西都是二进制的。总是通过对二进制值的“解释”才能得到数值、字符、机器指令或任何其他含义。因此,向二进制的转换比你想象的要少。

wnrlj8wa

wnrlj8wa2#

编程语言的保留字几乎都是由纯ASCII字符组成的。
int在源文件中存储为0x690x6E0x74,编译器必须解析并将其标识为保留字之一。这可以通过将这三个字节与保留字表中的字符串进行比较来完成,或者使用一些更高级的技术,如哈希查找。许多语言都有不区分大小写的保留字。在这种情况下,必须首先将解析的字X1 M4 N1 X转换为统一的字符大小写X1 M5 N1 X。
函数printf()的参数是一个字符串"A"。编译器将把它的值存储到目标文件中,通常是存储到**.rodata部分,作为0x41的字节序列。0x00(ASCII或UTF-8编码中以零结尾的字符串)。将字母A的ASCII值转换为二进制值没有任何意义-问题在于将字节内容解释为字母A**或其二进制值0x 41 =65

相关问题