C语言中char和unsigned char的区别

  在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,则结果会大相径庭。

  以上转载自https://blog.csdn.net/guotianqing/article/details/77341657

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

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

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

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