char分三类:char,signed,unsigned ?为什么?

MGOGM 2011-11-02 10:58:19
...全文
336 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
blackholeAC 2011-11-06
  • 打赏
  • 举报
回复
是三种 不同的。。char在不同的编译器中可能拥有不同范围的值。
只有当程序所使用的char型变量的值位于 signed char 和 unsigned char 的交集中,这个程序才是课移植的。
lengxujun 2011-11-02
  • 打赏
  • 举报
回复
char 是 signed char 还是 unsigned char 可由编译器的配置项设定;
char只有两种:signed char, unsigned char。
zhangyuehua123 2011-11-02
  • 打赏
  • 举报
回复
char如果非要像你所说的分类的话,实际上只分两类:
① char ,又叫 signed char;值范围: –128 --127
② unsigned char;值范围:0 --255

实际上他们只有表示值得范围的区别。

给你一个图你就会一目了然:
酱油党 2011-11-02
  • 打赏
  • 举报
回复
因为有的时候需要int与char相互转换。
孤独小剑 2011-11-02
  • 打赏
  • 举报
回复
char和signed char有符号的是一样,unsigned char是无符号的。
char和signed char范围都是-128~127,unsigned char范围是0~255。
高位的char即大于127的char是扩展char。
xiejijun_05 2011-11-02
  • 打赏
  • 举报
回复
char = signed char



char r = -10;
unsigned char s= -10;
signed char t = -10;

int ir = r;
int is= s;
int it= t;

printf("%d,%d,%d", ir, is, it);
AnYidan 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lengxujun 的回复:]

char 是 signed char 还是 unsigned char 可由编译器的配置项设定;
char只有两种:signed char, unsigned char。
[/Quote]

++
神农氏 2011-11-02
  • 打赏
  • 举报
回复
不过不能怪俺孤陋寡闻了,因为:
这么多年如果有bug是由于把char当成有符号数引起的,哪怕一次,俺也不至于不知道char 和signed char是不同的。
神农氏 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mesh4444 的回复:]

替11楼给个例子:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1114778
编译器不是就PC上这些,交叉编译的编译器太多了,表示不是专门搞嵌入式的,所以对上面给的编译器不了解……
char是什么,标准并没有说,但是几乎99%的程序员都习惯用char,而不会去想符号的问题,所以几乎不会有哪个编译器因为标准没说就不支持char这个类型,所以就……
[/Quote]

俺从2003年开始做嵌入式,Z80的,x86的,ARM的,DSP上的,呵呵,今天才知道char有3种,也从来还没有见谁把char设成unsigned char来用的。算是俺民工了。
如果说99%的程序员把char当成signed 来用,我想是有原因的,那是因为99%的编译器都是默认char就是signed.

sp_daiyq 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lengxujun 的回复:]
char 是 signed char 还是 unsigned char 可由编译器的配置项设定;
char只有两种:signed char, unsigned char。
[/Quote]
++
querdaizhi 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

char等价于signed char取值范围-128..127
unsigned char取值范围0..255
[/Quote]

顶。
FrankHB1989 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mmns 的回复:]

11楼,虚心向你请教,你能不能列出一个把char 当成无符号处理的编译器,我去学习学习。
[/Quote]
GCC用-funsigned-char选项(不用的话char类似signed还是unsigned取决于具体平台的ABI)。
子谋 2011-11-02
  • 打赏
  • 举报
回复
替11楼给个例子:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1114778
编译器不是就PC上这些,交叉编译的编译器太多了,表示不是专门搞嵌入式的,所以对上面给的编译器不了解……
char是什么,标准并没有说,但是几乎99%的程序员都习惯用char,而不会去想符号的问题,所以几乎不会有哪个编译器因为标准没说就不支持char这个类型,所以就自定义默认值了……
实际上很多编译环境的char类型是在编译预处理阶段进行预编译的,就跟TCHAR类型一样,在编译预处理中进行解释,对于跨平台编程的人来说,编译预处理是至关重要的……
FrankHB1989 2011-11-02
  • 打赏
  • 举报
回复
一堆人胡乱误导……LZ的说法是对的。
无论是C还是C++(上古方言不算),signed char、unsigned char、char是三种不同的类型。
不信的,自己试试同时声明/定义void foo(char)/void foo(unsigned char)/void foo(signed char),看是不是声明冲突/重载失败。
出现这种情况可以归结为历史原因。早期C没有专用于算术运算的单字节整数类型,实现中也无法保证char使用什么符号(不同符号转换为超过一个字节的整数类型时各个硬件平台的效率有差异)。后来才追加signed char和unsigned char。因此对于wchar_t,就没用signed/unsigned修饰的必要,除了其符号仍然是implementation-defined。
神农氏 2011-11-02
  • 打赏
  • 举报
回复
11楼,虚心向你请教,你能不能列出一个把char 当成无符号处理的编译器,我去学习学习。
MGOGM 2011-11-02
  • 打赏
  • 举报
回复
11楼: 这三种类型,给个实例!
MGOGM 2011-11-02
  • 打赏
  • 举报
回复
11楼: 给个实例!
bruceteen 2011-11-02
  • 打赏
  • 举报
回复
根据C/C++标准
1,char的表达范围可能等同于signed char,也可能等同于unsigned char,取决于编译器
2,但 char 和 signed char 和 unsigned char 是三种完全不一样的类型,正如不能因为32位编译器上int和long的表法范围一致就认为是同一种类型

对于楼主的问题
因为用途不同,char用于表达字符,你不应该关心其正负的实现
signed char 和 unsigned char 用于表达数值,或 可移植的char
pathuang68 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

char等价于signed char取值范围-128..127
unsigned char取值范围0..255
[/Quote]

++
xujianglun 2011-11-02
  • 打赏
  • 举报
回复
不同的编译器不同,
TC有两种,
有些编译器只有一种,没有unsigned cha
加载更多回复(3)

69,371

社区成员

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

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