《编写高质量代码:改善c程序代码的125个建议》——建议2-1:char类型变量的值应该限制在signed char与unsigned char的交集范围内

简介:

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第1章,建议2-1,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议2-1:char类型变量的值应该限制在signed char与unsigned 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';
除此之外,在表1-3中还可以看出,默认的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 变量统一声明为signed char或unsigned char未必就是好的解决方案。因此,最佳的解决方案就是把char类型变量的值限制在signed char与unsigned char的交集范围内,这样既可以获得最大程度的可移植性,同时又不会牺牲
效率。

相关文章
|
2月前
|
存储 编译器 C语言
c语言中char的作用类型
c语言中char的作用类型
29 0
|
7天前
|
C++
【C++】std::string 转换成非const类型 char* 的三种方法记录
【C++】std::string 转换成非const类型 char* 的三种方法记录
5 0
|
4月前
|
存储 人工智能 编译器
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
|
4月前
|
存储 算法 安全
C++系列-第1章顺序结构-9-字符类型char
C++系列-第1章顺序结构-9-字符类型char
|
4月前
|
存储 自然语言处理 安全
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
|
7月前
|
存储 小程序 程序员
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
64 0
|
7月前
|
存储 数据库
SAP CDS view 如何将 CHAR 类型的数据字段和当前系统日期比较
SAP CDS view 如何将 CHAR 类型的数据字段和当前系统日期比较
60 0
|
8月前
|
存储 关系型数据库 MySQL
MySql 字符串类型 - char、varchar
MySql 字符串类型 - char、varchar
62 0
|
8月前
|
存储 C语言
C语言:char与unsigned char类型数据的范围
unsigned char 的范围是 0~255,当 i=255 时,i++变为0,从0到255无限循环,因此程序运行结果为死循环
148 0
|
8月前
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
71 0