关于unsigned char和signed char的小问题

caicailiang 2011-05-15 11:53:29
在C++中,char类型可分为signed char 和unsigned char,它们实际上代表 -128到127 和 0到255的值。但ASCII码中只有0到127的值代表相应的字符。请问多出来的-128到-1 或者 128到255有什么用呢,它们又分别代表什么呢??求大师详解,感激不尽!!
...全文
633 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caicailiang 2011-05-15
  • 打赏
  • 举报
回复
感谢各位,学到不少东西!尤其感谢supermegaboy老师!!!
abcdef0966 2011-05-15
  • 打赏
  • 举报
回复
汉字的gbk编码就是超过了signed char范围的
飞天御剑流 2011-05-15
  • 打赏
  • 举报
回复
你在这几行字中存在很多误解。

C/C++标准规定了两种字符集:源码字符集和执行字符集。两种字符集各自分成了两部分,一部分叫基本字符集,另一部分叫扩展字符集。C/C++标准规定了基本字符集中应该具有哪些字符,但扩展字符集中的字符是实现相关的。ASCII码只是C/C++所规定的字符集的其中一种,只不过由于C/C++是源于美国人的绝活,因此ASCII码就成了一种最常用的字符集,但要认识到ASCII码并非全部,C/C++标准允许字符集的本地化,头文件locale.h就是用于处理本地化的。

char类型是用于处理字符的,它的底层类型可以是signed char,也可以是unsigned char,而signed char和unsigned char才是真正的整数类型,选择哪一种来实现char是实现相关的,如果你把char用作整数,就不应该用char这种类型,应显式地使用signed或者unsigned。

执行字符集的码值是实现相关的。

但无论哪种实现,char中表示的基本字符集都必须保证是正数。超过基本字符集部分的属于扩展字符集,对于ASCII码来说,就是signed char的负数部分和unsigned char的128--255部分。

无论C还是C++都规定char是一字节的,但一字节不一定只有8位,而是一字节至少8位,因此,signed char和unsigned char的码值不一定是-128--127或者0--255范围,这个范围只不过是常用字符集的码值范围。

所以,当你使用char、signed char或者unsigned char的边界的时候,不应该预设最大码值为127或255之类,这是错误的,应使用limits.h头文件中定义的宏,这些宏就是用于处理类似的移植性问题的,例如:

CHAR_MIN、CHAR_MAX、SCHAR_MIN、SCHAR_MAX、UCHAR_MIN、UCHAR_MAX等等。
volvoxc 2011-05-15
  • 打赏
  • 举报
回复
ASCII表里0到255都有相应的符号啊,再说不只是简单代表符号,代表什么都可以,只要不溢出
lirg8405 2011-05-15
  • 打赏
  • 举报
回复
你认为char类型只是为了表示或者存储ASCII码吗???
它只是一种类型,和其他类型是一样的,
就好像是一个碗,它只代表了它表装的量,不限制了要装什么,当然了,这个量是有限的,你不能放超过它能装的量的东西
char类型你只能放-128~127之间的数值,超过就溢出;
unsigned char你只能放0~255的数
king_ss_ 2011-05-15
  • 打赏
  • 举报
回复
由于常用的英文字符用8位二进制就可以表示,所以通常就将8位称为一个字节。这写多出来的数字并不代表什么,可以看作是一种冗余策略,就是有意让它多出来一些空间,如果以后有需要的话可以用它们在代表什么内容;试想一下,在设计的时候,总不能设计的不够标识这些字符,或者是恰好够,这样都是不好的,因为以后可能还要扩展。例如在编程时:Unicode字符集用16bit标识一个字符,它可以用来标识全世界各种语言的文字;多字节字符集用8bit标识一个字符。当然为什么是8bit、16bit应该还有另一个原因,就是现在计算机一般是32bit字长,就是cpu一次能处理32bit,用来标识字符的bit数要能被32整除,这样计算机cpu在处理信息时也方便一些,速度更快,效率更高。
king_ss_ 2011-05-15
  • 打赏
  • 举报
回复
supermegaboy讲的很好。学习了。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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