ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char
char相当于signed char或者unsigned char,但是这取决于编译器!
这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
signed char取值范围是 -128 到 127
unsigned char 取值范围是 0 到 255
但是char究竟相当于signed char呢还是相当于unsigned char呢??
这就是char和int的不同之处!
int==signed int,但是char不能简单以为==signed char
要确定char究竟等同什么要基于不同的编译器做测试
大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1
假设我的机器也是如此存储,就能据此判断char究竟是等于signed char还是unsigned char
程序如下:
[oracle@test c]$ vi test_char.c
#include
int main()
{
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
~
~
~
"test_char.c" [New] 12L, 148C written
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$ cc test_char.c -o test_char
[oracle@test c]$
[oracle@test c]$
[oracle@test c]$ ./test_char
a=-1,b=-1,c=255
[oracle@test c]$
据此可以判断在我的机器上char==signed char
但是绝对不能武断认为char==signed char就好像int==signed int 一样天经地义
说实话今天我就是看书的时候看到这一段说char不简单等同于signed char所以才发问的
刚才收到别人刺激自己找了好多资料还专门打电话问了过去的老师才有所了解
但是我想大部分人还是单纯认为char==signed char的,其实换位思考一下就清楚了
c规定了九种不同的整形其中有char和signed char 和 unsihned char
但是只有int 没有 signed int(二者相等)
如果简单认为char就是等同于signed char的话那8种不就完事了??
如果编译器支持unsigned char和char的等同,设置这个选项就会发现char==unsigned char
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参
数)或者 signed char(后两个参数)
[oracle@test c]$ vi test_char.c
#include
int main()
{
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
~
~
~
[oracle@test c]$ cc test_char.c -o test_char -funsigned-char
[oracle@test c]$ ./test_char
a=255,b=-1,c=255
[oracle@test c]$
如此 char就等同于unsigned char了