您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言中char和unsigned char的区别

时间:03-26来源:作者:点击数:

在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显式地在变量类型前加unsigned。

char在我所用的linux中一般都是8位一个字节,表示范围为-128~127。

unsigned char的表示范围为0~255。

而ASCII的最大值是127。因此我们如果使用char去表示字符,那么char和unsigned char是没有区别的。

当然如果去表示超过127的数,那么就会差别的。

注意:

如果直接用于数据传输,本质上unsigned char 和 char是没有区别的。。。因此传输过去的数据是什么,接收到的数据就是什么。

但是如果数据要用于显示,那就有区别。比如0xFF,在unsigned char用printf打印出来是255,而char是-1。

但是看过别人的一个博客,里面有指出,把一个char类型的变量赋值给int、long等数据类型或进行类似的强制类型转换时时,系统会进行类型扩展,这时区别就大了。对于char类型的变量,系统会认为最高位为符号位,然后对最高位进行扩展,即符号扩展。若最高位为1,则扩展到int时高位都以1填充。对于unsigned char类型的变量,系统会直接进行无符号扩展,即0扩展。扩展的高位都以0填充。所以在进行类似的操作时,如果char和unsigned char最高位都是0,则结果是一样的,若char最高位为1,则结果会大相径庭。

(注意:C语言中如果是有符号数,那么最高位为1时,表示负数)

简单的来说就是当char和unsigned char都要强制转换成int类型(虽然正常也不会直接把unsigned char转换成int),这个时候如果两个最高位都是0,就都没问题。但是如果最高位都为1,那么char转换成int是没问题。但是unsigned char转换就会把最高位的1当做符号位。

最简单的举例就是unsigned char:1000_0001,十进制就是129,那么转换成int类型后十进制就是-1。

应该没人会这么干,但是也要注意一下。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门