加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

表映射如何在C中工作?

发布时间:2020-12-16 09:53:53 所属栏目:百科 来源:网络整理
导读:我希望这个问题有道理!我正在学习C(转到简单!),我对表映射的工作方式感兴趣. 我正在使用扩展的ASCII表作为实验. (http://www.ascii-code.com) 例如,我可以创建一个char并将其值设置为代码,如下所示: char charSymbol = '~'; 我也可以像这样指定完全相同的
我希望这个问题有道理!我正在学习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的系统生成代码,反之亦然.这样的编译器必须具有从一个字符集到另一个字符集的查找表映射.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读