• 基础C语言知识串串香2☞char类型变量种种


    6217760-7a1d63bdb0bc5b7a.jpg

    文章参考微信公众号[嵌入式软件学习圈]

    char 类型变量种种

    1.使用char类型来执行字符处理

    大家应该都知道,C语言设计char类型的目的是存储字母和标点符号之类的字符。实际上, char类型存储的是整数而不是字符。为了处理字符,计算机使用一种数字编码的方式来操作,如常见的ASCII就是用特定整数来表示特定字符的。例如,要在ASCII码中存储字母B,实际上只需要存储整数66。因此,可以使用下面的方法为char类型的变量赋值。

    char c=66;
    

    在ASCII码中,整型数据66在char类型的大小范围之内,所以这样的赋值方式是完全允许的,但不推荐使用这样的赋值方式。

    这里需要注意的是,采用这样的赋值方式有个前提条件,即必须是在ASCII码中。有时候不同的计算机系统也会使用完全不同的编码,如一些IBM主机就使用一种称为EBCDIC( Extended Binary-Coded Decimal Interchange Code,扩充的二进制编码的十进制交换码)的编码方式。如果采用的是其他编码方式,这样的赋值方式所得到的结果就不- -样了。因此,我们推荐使用字符常量的方式进行赋值,如下面的代码所示:

    char c='B' ;
    

    除此之外,在表中还可以看出,默认的char类型可以是signed char类型( 取值范围为-127~127),也可以是unsigned char类型(取值范围为0~255),具体取决于编译器

    也就是说,不同的机器上char可能拥有不同范围的值。因此,为了使程序保持良好的可移植性,我们所声明的char类型变量的值应该限制在signed char与unsigned char的交集范围内。例如,ASCII字符集中的字符都在这个范围内。

    当然,在一个把字符当做整数值的处理程序中,可以显式地把这类变量声明为signed char或unsigned char,从而确保不同的机器中在字符是否为有符号值方面保持一致,以此来提高程序的可移植性。

    但是不要忘了,许多处理字符的库函数把它们的参数都声明为char,如果我们把这些参数显式地声明为signed char或unsigned char,可能会带来兼容性问题;并且有些机器处理signed char的效率更高些,如果硬要把它改成unsigned char,效率很可能会因此而受损。所以把所有的char变量统一声明为signedchar或unsignedchar未必就是好的解决方案。

    因此,最佳的解决方案就是把char类型变量的值限制在signedchar与unsignedchar的交集范围内,这样既可以获得最大程度的可移植性,同时又不会牺牲效率。


    2. 使用显式声明为signed char或unsigned char的类型来执行算术运算

    在讨论本建议话题之前,我们先看看下面的这段代码的输出结果,如代码清单1-1所示。

    #include <stdio.h>
    
    int main(void)
    {
        char c=150 ;
        int i=900;
        
        printf("i/c=%dn", i/c) ;
    
        return 0;
    }
    

    在代码中,或许大多数人都认为它输出的结果应该是“i/c= 6”,但实际的输出结果却大相径庭。

    前面已经讲过,char 类型的变量c可以有两种类型:有符号的(signed char)和无符号的( unsigned char)。这里假设char是8位的补码字符类型,那么代码清单就可能输出“i/c=-8”( signed char) 或者“i/c= 6”( unsigned char) 两种结果。其中,在GCC中的输出结果都是“i/c=-8",如图。

    6217760-e0a55da379addd47.png

    其实,导致这种结果最根本的原因就在于我们不能够准确地确定char类型的变量c究竟是signed char类型还是unsigned char类型。因此,我们把决策权交给编译器,而不同的编译器默认的char类型是不同的,所以最后得到的结果也就不相同。

    解决这种问题的办法很简单,就是显式地将char类型的变量c声明为signedchar或unsigned char类型,这样可保证结果的唯一性,如代码清单1-2所示。

    #include <stdio.h>
    
    int main(void)
    {
        unsigned char c=150;
        int i=900;
    
    printf("i/c=%dn", i/c) ;
    return 0;
    }
    

    这样就显式地将char类型的变量c声明为unsignedchar类型,现在,后面的除法运算(i/c) 与char的符号无关。

    往期热文:基础C语言知识串串香(1)


    ===========我是华丽的分割线===========


    更多知识:
    点击关注专题:嵌入式Linux&ARM

    或浏览器打开:https://www.jianshu.com/c/42d33cadb1c1

    或扫描二维码:

    6217760-e6bba06e005d8fe7.jpg

  • 相关阅读:
    中间件(1)分布式缓存
    大型网站架构演进(9)服务化
    大型网站架构演进(8)业务拆分
    大型网站架构演进(7)数据库拆分
    大型网站架构演进(6)使用NoSQL和搜索引擎
    大型网站架构演进(5)数据库读写分离
    大型网站架构演进(4)使用应用服务器集群
    大型网站架构演进(3)使用缓存改善网站性能
    大型网站架构演进(2)数据库与应用服务器分离
    大型网站架构演进(1)单机网站
  • 原文地址:https://www.cnblogs.com/leon1124/p/14039762.html
Copyright © 2020-2023  润新知