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

news/2025/3/21 23:51:44

本节书摘来自华章计算机《编写高质量代码:改善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的交集范围内,这样既可以获得最大程度的可移植性,同时又不会牺牲
效率。


https://dhexx.cn/news/show-2510080.html

相关文章

理解C++ dynamic_cast

理解C dynamic_cast 在面向对象程序设计中,有时我们需要在运行时查询一个对象是否能作为某种多态类型使用。与Java的instanceof,以及C#的as、is运算符类似,C提供了dynamic_cast函数用于动态转型。相比C风格的强制类型转换和C reinterpret_cas…

高通芯片命名规则 kryo 485是个什么样的架构?

kryo 485是个什么样的架构? 参考链接: https://www.zhihu.com/question/333289453/answer/741239321 https://blog.csdn.net/weixin_44124323/article/details/110920987 高通芯片命名规则 骁龙后面的三个数字,例如 865,768 代…

《树莓派Python编程入门与实战(第2版)》——2.4 LXDE图形界面

本节书摘来自异步社区《树莓派Python编程入门与实战(第2版)》一书中的第2章,第2.4节,作者[美] Richard Blum Christine Bresnahan,陈晓明 马立新 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。…

Linux下切换Python版本的几种方法

Linux下切换Python版本的几种方法 参考链接: 1、https://www.cnblogs.com/feynxd/p/11367806.html 2、https://blog.csdn.net/weixin_34355559/article/details/93215997 本篇博文面向Linux用户,在Ubuntu下测试通过 0 为什么需要有两个版本的Python…

软件开发、硬件开发、IPD产品开发 及 工程开发各阶段划分

软件开发、硬件开发、IPD产品开发 及 工程开发各阶段划分 参考链接:https://zhuanlan.zhihu.com/p/427246890 1、软件开发阶段划分: Alpha、Beta、RC、GA/MR1 2、华为硬件开发阶段划分: V1、V2 、V3 、V4 、VN1、VN2 其他硬件开发阶段划分1: ES、 CS、 PP、M…

《Android 平板电脑开发实战详解和典型案例》——2.6节可展开列表—— ExpandableListView...

本节书摘来自异步社区《Android 平板电脑开发实战详解和典型案例》一书中的第2章,第2.6节可展开列表—— ExpandableListView,作者 吴亚峰 , 杜化美 , 索依娜,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.6 可展开列表—— Expand…

嵌套类与局部类

一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现&…

DBA避坑宝典:Oracle运维中的那些事儿

对于Oracle运维中的那些事儿,我的最终目的:不是比谁更惨,而是能够从中吸取经验和教训。 从我的理解来看,我会从下面的几个方面来进行说明DBA运维中的一些事儿。 每个部分都是非常关键的,缺一不可,而且每一部…

再论空指针检测问题

某些C/C编程的书中,曾经提到如何判断指针是否为空的问题.很显然,if (p NULL), if (p 0) 和if(p),都能够完成这一任务,差别在于可读性方面.我们分别加以讨论. 1. if (p NULL) 相当多的文章建议采用,他们中的部分人甚至认为,其他做法都是错误的.这个形式一个变种是 if (NULL …

车联网V2X介绍之:通信芯片

车联网V2X介绍之:通信芯片 参考链接:https://zhuanlan.zhihu.com/p/115276002 目前,我国产业化进程逐步加快,产业链上下游企业已经围绕LTE-V2X形成包括通信芯片、通信模组、终端设备、整车制造、运营服务、测试认证、高精度定位及…