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

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语言
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif