跳至内容
响水凹
欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki
用户工具
登录
站点工具
搜索
工具
显示页面
过去修订
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
computer:c:tips:sign_of_char
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== char类型的符号问题 ====== char类型可以是有符号(signed)类型,也可以是无符号(unsigned)类型,甚至是两者的混合类型,具体依赖于编译器的实现。 所以,当确定需要有符号的char类型时,请直接使用signed char;当确定需要无符号的char,则直接使用unsigned char。 char的这种模糊性,在涉及到符号问题时,需要分外小心。 例如,很常见的库函数getchar()的用法: <code c> while ((ch = getchar()) != EOF) { ... } </code> 这里如果变量ch定义为: <code c> char ch; </code> 则当char是无符号(unsigned char)实现时,代码无法工作。假设char占8bit,int占16bit,且内部表示使用二进制补码,则: - EOF(-1)赋给ch时,转换成无符号数255,条件表达式变成(unsigned char)255 != (int)-1。 - 接下来进行[[.:binary_conversions|二元转换]]: * 在Traditional C下,-1转换成无符号整数65535,最终的条件表达式是(unsigned int)255 != (unsigned int)65535; * 在标准C下两者都转换成int,最终的条件表达式是(int)255 != (int)-1。 - 结果都导致永真循环。 所以正确的做法是ch定义为int: <code c> int ch; </code> 这也是getchar()等库函数的返回值都是int的原因: <code c> int getchar(void); </code> {{tag>C语言}}
computer/c/tips/sign_of_char.txt
· 最后更改: 2014/11/01 02:02 由
127.0.0.1
页面工具
显示页面
过去修订
反向链接
回到顶部