--来自百度
整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在除char以外的数据类型中,默认情况下声明的整型变量都是有符号的类型;char在默认情况下总是无符号的。在除char以外的数据类型中,如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个short能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
C语言中的 unsigned int 和 signed int 类型的区别,最大的区别就是最高位是否用来做符号位。
但是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 型变量是否有符号,则属于未定义,在不同的编译器上表现可能是不同的。