11

C语言中的char类型为什么也有signed和unsigned,字符怎么会有符号呢?

 3 years ago
source link: https://blog.popkx.com/c%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84char%E7%B1%BB%E5%9E%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B9%9F%E6%9C%89signed%E5%92%8Cunsigned-%E5%AD%97%E7%AC%A6%E6%80%8E%E4%B9%88%E4%BC%9A%E6%9C%89%E7%AC%A6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

C语言中的char类型为什么也有signed和unsigned,字符怎么会有符号呢?

发表于 2019-08-14 11:08:14   |   已被 访问: 571 次   |   分类于:   C语言   |   暂无评论

C语言中的 unsigned int 和 signed int 类型的区别,相信即使是初学者也是清楚的,无非就是最高位是否用来做符号位而已。但是最近有读者问我,为什么 char 类型也要区分 unsigned char 和 signed char 型呢?字符怎么可能还区分正字符和负字符呢?

其实,C语言中并没有专门用来表示字符的数据类型,事实上,char 像 int、short 类型一样,也是一种整型,只不过,char 类型是最短的整型而已,所以它当然可以有 signed 和 unsigned 两种类型。

的确,char 是 character 的缩写,很多时候我们会把 char 类型当作是“字符类型”,但是在高度概括抽象的C语言中,字符也是整数,只不过它们遵循一些编码而已,因此说 char 类型也是一种整型并不为过。

如果要说C语言中 char 类型与 short、int 等整数类型的区别,除了占用内存宽度不同,其他唯一的区别可能就在于:char 类型一般不等同于 signed char 型。

也就是说,不指定 signed 或者 unsigned 的 char 类型,在C语言中是未定义的,若考虑不同的编译器,我们不能确定 char 类型到底是有符号的,还是无符号的。而对于 short、int 类型,如果不明确指定 signed 或者 unsigned,一般默认其为有符号的。

稍稍总结一下,C语言中的 unsigned char 型的变量最高位也用于表示数值大小,而 signed char 类型变量的最高位则用于表示数值的符号 +/-,char 型变量是否有符号,则属于未定义,在不同的编译器上表现可能是不同的。因此,对于:

char a;
signed char b;
unsigned char c;

对于变量 b,只有低 7 位表示它的数值,也即 -128~127。对于变量 c,所有的 8 位都用于表示数值,因此它可以表示的数值范围为 0~255(2^8-1)。

按理说,变量 b 的最高位是符号位,它能表示的数值范围是 (+/-)(2^7-1),也即-127~127,但是为什么大家都说它的范围是 -128~127 呢?如果读者觉得费解,我将在之后解答,敬请关注。

也有人这么理解:char 类型用于表示字符类型时,鉴于“字符没有正负之分”,此时 signed 和 unsigned 都会被C语言编译器丢弃,就像编译器丢弃注释一样。但是我认为,在学习C语言中,不应该为自己设置这么多“特例”,否则总有弄混的时候,能够统一的东西,尽量统一理解:char 类型是整数类型,C语言中的字符也不过是一种编码后的整数而已。

“高度统一美”不仅在计算机领域,在其他领域也是如此,科学巨匠爱因斯坦晚年的主要工作之一就是统一几大基本作用力。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK