unsigned char 赋值多大

C++之char&,&signed&char&,&unsigned&char
ANSI C 提供了3种字符类型,分别是char、signed
char、unsigned
char.而不是像short、int一样只有两种(int默认就是unsigned int).
三者都占1个字节(1 byte),因此:
signed char取值范围是 -128 到 127(有符号位)
unsigned char 取值范围是 0 到 255
这个大家都很清楚!!
但是char 呢?范围是多少?
答案是:不一定!!!
我们先看一下大师们怎么说的:
(Thinking in C++ 2nd):
signed is the default and is only
char may or may not default to
signed. By specifying signed char, you force the sign bit to
译文:有符号类型是默认(指的是对于其他整型如int等来说)的类型并且仅对于char来说才是必须的。char有可能是signed也有可能是unsigned(我想这可能取决于编译器的具体实现)。但通过显式地指定一个char为signed,你就迫使其成为有符号的字符型。
我的看法是:
我们首先从这些类型的用处开始想起!
char是用来声明字符的!
而signed char和unsigned char是用来声明数值的,和int与unsigned
int一样,只是其占据的空间少(这在手机等空间有限的嵌入式系统中尤其有效!),表示的范围有限。
那么char在各个编译器中是怎样实现的?
c标准中对此是 Impementation
Defined,就是未明确定义,由具体的编译器明确定义。
但是一般都是用signed char或unsigned
char来实现char的,因为这三种类型的对象在存储介质中的表现形式是一样的(都是一个占8bit的01串,只是解析的时候不同)。
至于到底是signed char还是unsigned
char,各个编译器不同!!VC编译器、x86上的GCC都把char定义为signed
char,而arm-linux-gcc却把char定义为 unsigned char.
这样一来,在代码移植(困扰我们程序员的一个问题)上就会出现问题,举个最简单的例子:
char a = 0xb6;
&if ( a == 0xb6) puts("hello world !");
在vc 或 x86的gcc 上,都是不会打印出 hello world! 的。
用 arm-linux-gcc 编译,在arm板上,是可以打印出hello world ! 的。
我们再变化一下:
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if ( a == 0xb6) puts("a");
if ( b == 0xb600) puts("b");
if ( c == 0xb6000000) puts("c");
在vc 或 x86的gcc 上,只会打印出 c 。用 arm-linux-gcc 编译,在arm板上,是可以打印出 a 和 c
。是不是发现了什么了呢?
首先,介绍 Integer Promotion(整数提升) 。通俗点说,c在处理整型(char short
int)时,都会自动提升为int(如果int范围不够,则提升成 unsigned int)。比如&
“a == 0xb6”,首先0xb6会当一个int来处理,变为0x(关于常量,后面还会仔细说明)。a 会提升为int
,假如 char 被定义为有符合的,那么 a 为负数,因为最高位为1,所以 a会提升为 0xffffffb6。假如 char
被定义为无符号的,那么a会提升为 0x 。
即,在vc 或 x86的gcc 上,(a == 0xb6) 会变为 (0xffffffb6 == 0x) ,而在
arm-linux-gcc 上,变为(0x == 0x)。
对于 short,因为c标准明确规定 不加关键字,就代表有符号数。所以,无论在什么编译器上 b == 0xb600 都会变成
0xffffb600 == 0x 。
对于 int,本身是int,也就不用 Integer Promotion 了,所以& c ==
0xb60000 中 ,c不做任何处理,直接从内存中读出来,即& 0xb60000 ==
0xb60000。
最后,简单说一下常量。用八进制(0开头)或十六进制(0x开头)表示的常量,他们都会当成无符号数处理! 另外 像 char a =
0xb6; 这句就有两个 Implementation Defined,一个是char带不带符号,另外一个是,假如char为有符号,
0xb6 会当int 0x 处理,把这个int 变为 有符号的 char
有溢出,会有问题,0xb6本为正数,赋值到a中却变为负数,具体要怎么处理,c对此也是 Implementation Defined。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用户名:xnl
文章数:10
访问量:2823
注册日期:
阅读量:1297
阅读量:3317
阅读量:583348
阅读量:468429
51CTO推荐博文
前几天遇到了这么个问题 ,在学习 unsigned char和char 和signed char的区别时 ,说char的类型到底是signed 还是unsigned 取决于编译器 。当时写了一串代码 如下:char&a=-1;
&&&&printf("%d\n",sizeof(a));
&&&&printf("%d\n",a);
&&&&printf("%u\n",a);先说%d 是将数据以int型的 十进制 格式输出;&&&&%u 是将数据以unsigned int 的十进制格式输出;那么为何会输出 呢? 再怎么理解 char 类型也只是占用了 一个字节& ,而这个结果分明是4个字节的最大整数啊!为此当时还特意查看了 内存状况& 如下:查询了一下 cc在内存中表示的是 随机数 。这就让我更难理解了:为何会输出一个 四个字节的最大int整数?当时我百度的是 %d和%u的区别 ,,后来我知道 我的方向错了,,导致这个结果的原因是printf 函数对于 unsigned 和signed char的区别。1、printf中采用%d的格式输出& 就是讲元素的内存块 以有符号的形式读出来,如char a=-1;内存中就是 0xff ,这个数字用有符号的读出来 显示的就是 -1(原码,反码,补码的关系有讲)而printf用%u的格式时 ,若被读的数是unsigned 类型,则不会有 “字符扩张”,若是signed 类型的(char short int long)都会有字符的扩展,而这个扩展在内存中是查看不到的,扩展成四个字节的数据, 具体如下:&&&&若要读的数据 小于0,在内存中 符号位是1,扩展的时候,不足32位的都要在前面扩展出来的位补1(因为最前面是1,类似于&& &&左移右移时的方法),这个扩展出来的数 再以无符号int型十进制读。例如本例的-1 ,内存中是0xff ,扩展之后的就是0xff ff ff ff& 这样再读就是了。而如果是 1的话 内存中是0x01 (最前面是0) 所以扩展出来的也是0,即0x00 00 00 01,再读出来也是1.#include&stdio.h&
int&main()
&&&&char&c1=1,c2=-1;
&&&&printf("%d\n",c1);
&&&&printf("%d\n",c2);
&&&&printf("%u\n",c1);
&&&&printf("%u\n",c2);
&&&&printf("#####################\n");
&&&&long&l1=1,l2=-1;
&&&&printf("%d\n",l1);
&&&&printf("%d\n",l2);
&&&&printf("%u\n",l1);
&&&&printf("%u\n",l2);
&&&&printf("#####################\n");
&&&&unsigned&char&c3=1,c4=-1;
&&&&printf("%d\n",c3);
&&&&printf("%d\n",c4);
&&&&printf("%u\n",c3);
&&&&printf("%u\n",c4);
&&&&printf("#####################\n");
&&&&unsigned&long&l3=1,l4=-1;
&&&&printf("%d\n",sizeof(l4));
&&&&printf("%d\n",l3);
&&&&printf("%d\n",l4);
&&&&printf("%u\n",l3);
&&&&printf("%u\n",l4);
&&&&return&0;
}运行结果:注:最后的unsigned long l4=-1;在以%u输出的时候,结果也是,但是却并不是字符扩展的结果,因为它本来就占了4个字节,在内存中为0xFF FF FF FF,所以输出像是也进行了字符扩展一样。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:未分类┆阅读(0)┆评论(0)char 与 unsigned char的本质区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
char 与 unsigned char的本质区别
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2013年10月 Linux/Unix社区大版内专家分月排行榜第二2013年9月 Linux/Unix社区大版内专家分月排行榜第二
2013年12月 Linux/Unix社区大版内专家分月排行榜第三2013年11月 Linux/Unix社区大版内专家分月排行榜第三2013年6月 Linux/Unix社区大版内专家分月排行榜第三
2013年3月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 unsigned char 的文章

 

随机推荐