新闻资讯
看你所看,想你所想

unsigned char

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:
图1图1
结果分析:
对于(signed)char来说,0x80用二进制表示为1000 0000,当它作为char赋值给unsigned int或 int 时,系统认为最高位是符号位,会对最高位进行扩展。而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。
对于unsigned char来说,不管最高位是0,还是1,都不会做扩展。

转载请注明出处海之美文 » unsigned char

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com