unsigned char
char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标準中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。
基本介绍
- 中文名:unsigned char
- 类别:c++关键字
- 来源:c++
- 用法:变数时会发生位元组截断
介绍
unsigned char是无符号位元组型,char类型变数的大小通常为1个位元组(1位元组=8个位),且属于整型。整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变数都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的数据,比如16位系统中一个int能存储的数据的範围为-32768~32767,而unsigned能存储的数据範围则是0~65535。
同样,在32位系统中一个char类型一般为8个bit,所以能存储的数据範围为-128~127,而unsigned char则是0~255,字元型所存储的数据是用来表示字元的,例如ASCⅡ或Unicode。
存储
unsigned char在计算机中使用补码存储,例如
unsigned char a = 0xF7;
a在计算机中存储的方式为:11110111
类型转换
int/unsigned int变数赋值给 unsigned char变数是会发生位元组截断(9位和高于9位的将被程式自动丢弃)
unsigned int a = 0xFFFFFFF7;
unsigned char b = (unsigned char)a;
此时b的值为 0xF7.
char 与 unsigned char的本质区别
在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别。
首先在记忆体中,char与unsigned char没有什幺不同,都是一个位元组,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。
在实际使用过程种有什幺区别呢?主要是符号位,但是在普通的赋值,读写档案和网路位元组流都没什幺区别,反正就是一个位元组,不管最高位是什幺,最终的读取结果都一样,只是你怎幺理解最高位而已,在萤幕上面的显示可能不一样。
二者的最大区别是:但是我们却发现在表示byte时,都用unsigned char,这是为什幺呢?首先我们通常意义上理解,byte没有什幺符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。如果是char,那幺系统认为最高位是符号位,而int可能是16或者32位,那幺会对最高位进行扩展(注意,赋给unsigned int也会扩展)而如果是unsigned char,那幺不会扩展。最高位若为0时,二者没有区别,若为1时,则有区别了。同理可以推导到其它的类型,比如short, unsigned short,等等。
具体可以通过下面的小例子看看其区别。
include <stdio.h> void f(unsigned char v) { char c = v; unsigned char uc = v; unsigned int a = c, b = uc; int i = c, j = uc; printf("----------------\n"); printf("%%c: %c, %c\n", c, uc); printf("%%X: %X, %X\n", c, uc); printf("%%u: %u, %u\n", a, b); printf("%%d: %d, %d\n", i, j); }int main(int argc, char *argv[]) { f(0x80); f(0x7F); return 0; }
结果输出如图1:

结果分析:
对于(signed)char来说,0x80用二进制表示为1000 0000,当它作为char赋值给unsigned int或 int 时,系统认为最高位是符号位,会对最高位进行扩展。而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。
对于unsigned char来说,不管最高位是0,还是1,都不会做扩展。
转载请注明出处海之美文 » unsigned char