表映射如何在C中工作?
我希望这个问题有道理!我正在学习C(转到简单!),我对表映射的工作方式感兴趣.
我正在使用扩展的ASCII表作为实验. (http://www.ascii-code.com) 例如,我可以创建一个char并将其值设置为代码,如下所示: char charSymbol = '~'; 我也可以像这样指定完全相同的值: char charDec = 126; char charHex = 0x7E; char charOct = 0176; char charBin = 0b02222210; 无论我选择哪种上述声明(如果我理解正确的话),每个变量在内存中保存的值总是完全相同.也就是二进制表示(02222210) 我的问题是;编译器是否保留扩展的ASCII表并在编译期间执行二进制值查找?如果是这种情况,程序运行的机器是否也保持扩展的ASCII表,以便知道当程序被要求打印02222210以屏幕显示它是否打印“?”? 解决方法
对于您问题中的大多数代码,不需要ASCII查找表.
请注意,在C中,char是整数类型,就像int一样,但更窄.像’x’这样的字符常量(由于历史原因)具有int类型,而在基于ASCII的系统上x与120非常相似. char charDec = 126; char charHex = 0x7E; char charOct = 0176; char charBin = 0b02222210; (标准C不支持像0b02222210那样的二进制常量;这是gcc扩展名.) 当编译器看到像126这样的整数常量时,它会从中计算一个整数值.为此,需要知道1,2和6是十进制数字,它们的值是什么. char charSymbol = '~'; 为此,编译器只需要识别?是有效字符. 编译器从文本文件C源中读取所有这些字符.该文件中的每个字符都存储为8位序列,表示0到255之间的数字. 因此,如果您的C源代码包含: putchar('~'); (并且?恰好具有值126),然后编译器需要知道的是126是有效字符值.它生成将值126发送到putchar()函数的代码.在运行时,putchar将该值发送到标准输出流.如果标准输出转到文件,则值126存储在该文件中.如果它要到终端,终端软件将进行某种查找以将数字126映射到显示为波形符号的字形. 编译器必须识别特定的字符值.他们必须认识到这是加号字符,用于表示加法运算符.但是对于输入和输出,不需要ASCII映射,因为每个ASCII字符在处理的所有阶段(从编译到执行)都表示为数字. 那么编译器如何识别”字符? C编译器通常用C编写.在编译器自己的源代码中,可能有类似的东西: switch (c) { ... case '+': /* code to handle + character */ ... } 因此编译器在其输入中识别,因为它自己的源代码中有一个 – 并且(存储在编译器源代码中为8位数字43)导致数字43存储在编译器自己的可执行机器代码中. 显然第一个C编译器不是用C编写的,因为没有任何东西可以编译它.早期的C编译器可能是用B语言编写的,或者用BCPL编写的,或者用汇编语言编写的 – 每个编译器都由编译器或汇编器处理,这些编译器或汇编器可能会识别,因为它有自己的源代码.每一代C编译器都将“知识”传递给它编译的下一个C编译器. 43的“知识”不一定写在源代码中;每次使用旧编译器编译新编译器时它都会传播. 有关此问题的讨论,请参阅Ken Thompson的文章“Reflections on Trusting Trust”. 另一方面,您也可以使用在基于ASCII的系统上运行的编译器,该系统为基于EBCDIC的系统生成代码,反之亦然.这样的编译器必须具有从一个字符集到另一个字符集的查找表映射. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |