au_business 发表于 2011-9-9 15:45:43

关于char、signed char 和 unsigned char 的区别

最近在调试LPC2132与C8051F310之间的SPI通信时发现,在ARM中signed char 与char 是不一样的(ARM开发环境为Keil),因为这个原因使得返回的数据出现了错误……

我看到网上有朋友这样解释:

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
其实换位思考一下就清楚了
c规定了九种不同的整形其中有char和signed char 和 unsigned char
但是只有int 没有 signed int(二者相等)
如果简单认为char就是等同于signed char的话那8种不就完事了??


大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1
假设我的机器也是如此存储,就能据此判断char究竟是等于signed char还是unsigned char
程序如下:
$ vi test_char.c

#include <stdio.h>

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" 12L, 148C written
$
$
$
$
$ cc test_char.c -o test_char
$
$
$ ./test_char
a=-1,b=-1,c=255
$
据此可以判断在我的机器上char==signed char

要确定char究竟等同什么,则要基于不同的编译器做测试。
此外在IAR的language的选项中char默认选择为unsigned char。
我觉得这个值得大家观察一下。
页: [1]
查看完整版本: 关于char、signed char 和 unsigned char 的区别