unsigned char是什么?

wit2188 2007-10-09 03:16:15
好像有unsigned char这个类型吧,这个类型够怪,教材根本没提到,那么这是一个怎样的类型呢,它又为什么会存在呢?
还有,计算机里的int和short存储空间一样,表数范围也一样,那么只保留一种类型不就行了,教材为什么还要把两个类型都保留呢?
...全文
25085 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
l_sp2010 2011-12-29
  • 打赏
  • 举报
回复
大家说得够详细了,
用unsigned char 还有一点就是
可以把int 类型 赋值给 它;
比如 KMP 模式匹配里面 的T[0]
sunfish_iris 2011-12-17
  • 打赏
  • 举报
回复
unsigned char 用来表示一个 0-255 的数.
柴华松 2011-12-14
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
gabriel_wangjx 2011-10-24
  • 打赏
  • 举报
回复
java的byte类型 就是unsigned char ,VC也提供了这个类型 ,但这个不是标准C的基本类型
lvyuehuawu 2011-10-24
  • 打赏
  • 举报
回复
请问各位大侠,在asp.net页面怎样调用C++中的带参指针方法的dll呀?
hexuyue 2011-07-29
  • 打赏
  • 举报
回复
都是些高手啊
iambic 2007-10-12
  • 打赏
  • 举报
回复
to eliuzhi:

确实有点纠缠不清。

我的意思就是理解别人的误区是一回事,我们自己怎么实践是另一回事。
我的建议是自己在符号敏感的环境中明确指定(un)signed。而把别人需要但是没有明确指出的代码视为BUG

C++中的char没有默认的sign属性,这应该是一个普遍的常识(虽然实际没有那么普遍)。我们本就不应该做默认signed的这种假设。
giggham 2007-10-12
  • 打赏
  • 举报
回复
谭老伯害死人啊
我啃 2007-10-12
  • 打赏
  • 举报
回复
当int,short,long没有标明signed or unsigned时编译器认为他们是signed的
但是 char编译器不指定默认是unsigned 或者是signed
具体请见标准,估计是可移植性的问题

此外关于unsigned char和BYTE的关系
通常,注意仅仅是通常我们使用unsigned char 来实现byte,但是鉴于某些特殊架构上BYTE可能不是8BITS(例如可能是9BITS)所以unsigned char只能作为某些情况下的替代品

<Imperfect C++>里面有详细的关于“13.1. May I Have a byte? ””给我一个字节“的讨论,十分有意思
具体可以参考此书,这里只写一下结论:
说到底,C++并不提供所谓的真正一个BYTE的数据类型,只不过unsigned char 被视为了通常的替代品

<Imperfect C++>里的选段:
Unfortunately, there is no byte type in C/C++, and so the common practice in such cases is to use char. This makes sense, since the size of char is always one byte. The (C++-98) standard does not say this directly, but it does say (C++-98: 5.3.3) that "the sizeof operator yields the number of bytes in the object representation of its operand" and "sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1." Clearly, then, sizeof(char) == sizeof(byte) must always be true. (Note that a byte is not necessarily 8 bits, just that it is "large enough to fit the basic character set" [C++-98: 3.9.1.1].

很不幸,C++没有提供BYTE类型,所以通常情况下我们使用char来替代。这个是有道理的,因为通常char的大小是一个字节。C++98标准没有直接提到这个,但是在5.3.3里说到:“sizeof操作符获得的是对象需要的内存字节数,而sizeof(char)==sizeof(signed char)==sizeof(unsigned char)==1”,很明显sizeof(char) == sizeof(byte)总应该是对的。
(注意一个自己不总是8比特,只需要它足够大,达到能够存下基本的字符集)[C++-98: 3.9.1.1].

翻译质量很差,也没有校验,水平差能力差,姑且请各位见谅
iambic 2007-10-12
  • 打赏
  • 举报
回复
unsigned char可以来表示byte类型。当你想把内存作为原始字节序来操作时就有用了。
wit2188 2007-10-12
  • 打赏
  • 举报
回复
老实说,诸位说了这么多,我还是不太清楚unsigned char这个类型有什么用,char很清楚,就是字符类型,放字符的,但unsigned char是干什么用的呢?
wit2188 2007-10-12
  • 打赏
  • 举报
回复
老实说,诸位说了这么多,我还是不太清楚unsigned char这个类型有什么用,char很清楚,就是字符类型,放字符的,但unsigned char是干什么用的呢?
eliuzhi 2007-10-11
  • 打赏
  • 举报
回复
to iambic:
是的,我赞同你的说法,一般情况业界大多数情况char 默认为有符号,unsigned char默认为无符号,这点我们可以从海量的开源代码中看到,比较典型的是处理多媒体文件的文件头中的多媒体类型标识符时。
不同的需求会有不同的风格,灵活但且危险就是C的本性,没有人能决定一切,所以我也挺后悔在这个问题上发言,有点纠缠不清。
iambic 2007-10-11
  • 打赏
  • 举报
回复
to eliuzhi:
如果char有无符号是重要的,那就应该明确指出它的符号。你不能保证别人的编译环境和你的一致。
Don_Chou 2007-10-11
  • 打赏
  • 举报
回复
书中的原句:“有些系统(如PDP,VAX-11,Turbo C)将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signed char型。他的取值范围是-128~127.如果使用ASCII码为0~127间的字符,由于字节中最高位为0,inci用%d输出时,输出一个正整数。如果使用ASCII码为128~255间的字符,由于字节中最高位为1,用%d格式输出时,就会得到一个负整数。...。如果不想按有符号处理,可以将字符变量定义为unsigned char类型,这时其取值范围是0~255.signed char和unsigned char的含义及用法与signed int和unsigned int相仿,但它只有一个字节。” 本人第一次发言,不知道能不能给大家带来一点帮助,请多多关照!
0黄瓜0 2007-10-10
  • 打赏
  • 举报
回复
看来是我孤陋寡闻了.C++ primer 4E 上说.
只有int ,short int ,long int默认才是signed的.
一字节数据类型有signed char,unsigned char. char 可以是signed char,也可能是unsigned char,使用哪种由编译器决定. 这里又体现了C++的变态.
eliuzhi 2007-10-10
  • 打赏
  • 举报
回复
9楼的,不要误人子弟,unsigned就是无符号的意思,不但有unsigned char,还可以unsigned short, unsigned int, unsigned int_64
就是定义一个数值变量在理解其自身内存中的内容时是当作有符号来解释还是当作无符号来解释,有没有符号不会影响类型的长度,32位下个长度如下。

char 1 byte | 8 bit
short 2 byte | 16bit
int 4 byte | 32bit
long 4 byte | 32bit
0黄瓜0 2007-10-10
  • 打赏
  • 举报
回复
iambic说的是对的
char可能为unsigned,也可能为signed,标准并没有明确规定。不过一般编译器当作signed处理
因此要程序可移植性好,最好明确声明char的类型
===========================================
请问,什么编译器把char当unsigned char处理. 我的印象是:
C/C++的基本数据类型除浮点数外,凡是没有明确指定unsigned的,都是signed的.比如int 就是signed int. char就是signed char. 有符号,无符号对移位运算和类型提升有影响,输出形式不一样大家都知道 . 在这个问题上应该不会出现混乱.

只是说,有些应用,数据声明为unsigned char或signed char都是对的.
babala512 2007-10-10
  • 打赏
  • 举报
回复
很简单啊,拓展askii码255个,因而大于125的高位肯定是1 ,这里就有两种解释了,是作为有符号数呢,还是无符号数?
star119119 2007-10-10
  • 打赏
  • 举报
回复
unsigned char //无符号字符型 表示范围0~255
char //有符号字符型 表示范围-128~127

short //一般情况下是short int的简写,表示短整形,其长度一般情况下只有int长度的一半。
加载更多回复(20)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧