2013年4月22日星期一

C语言中关于char是否为有符号的问题


gccchar默认是有符号数,但是“char a = 255;”是正确的,a会自动保存为-1。如下代码:
char ch = 255;
printf("ch = %d\n", ch);
结果为-1
那么,这里有这么一个现象:
char ch = 255;
ch -= 128;
printf("ch = %d\n", ch);
得到的结果为“ch = 127”,这并不是因为255 - 128 = 127,而是-1 - 128 = 127。因为char是单字节的,-1 - 128是不够减的,由于存储空间只有8位,第九位无法表示符号,所以被舍弃,丢了符号位的数字转换为二进制成为了127
这里举个简单点的例子:
-1288位二进制为1000 0000
-128 - 1 得到的8位二进制为 0111 1111 DEC:127
这是因为,8位二进制无法表示-129,舍弃第九位后,就变为127了。

如何查看自己的gccchar的处理呢?方法如下:
#include <limits.h>
int main()
{
    printf("CHAR_MIN = %d\n", CHAR_MIN);
    return 0;
}
limits.h中定义了char的最小值CHAR_MIN,如果CHAR_MIN = -128,则char是有符号数,如果CHAR_MIN = 0,则char是无符号数。

没有评论:

发表评论