签名字符有什么用?字符中包含的负值仅用作较小的整数数据类型中的整数值而不是int和short ??他们没有其他解释吗?(如表示字符的字符中的正值)
答案 0 :(得分:11)
'C'中的字符用于表示字符。
并非总是如此,字符用于表示字节,它们是c中已知大小的唯一类型。
答案 1 :(得分:4)
代表所有代码页中字符的数字总是正数。
呃... 错误!?
从C99标准来看,强调我的:
如果基本执行字符集的成员存储在char对象中,则其值保证为正。
不保证所有代码页的所有有效字符都是正数。 char
是签名还是无符号是实现定义的!
答案 2 :(得分:4)
只保证基本执行字符集的字符为非负(C99,6.5.2§3):
声明为char类型的对象是 大到足以存储任何成员 基本执行字符集。如果 基本执行的成员 字符集存储在char中 对象,其值保证 非负。如果有任何其他角色 存储在char对象中,由此产生 value是实现定义的但是 应在数值范围内 可以用那种类型表示。
您必须在“普通”char
类型与类型signed char
和unsigned char
之间进行区分:signed char
和unsigned char
是普通的整数类型以下内容(C99,6.5.2§5):
声明为signed signed char类型的对象占用与a相同的存储量 ''普通''char对象。
答案 3 :(得分:2)
有符号字符可以包含在limits.h中定义的SCHAR_MIN到SCHAR_MAX范围内的所有值。 SCHAR_MIN必须为-127或更小(更负),并且SCHAR_MAX必须为127或更大。请注意,许多使用2的补码表示的处理器编译器支持-128的SCHAR_MIN,但标准不要求这样做。
据我所知,signed char
没有正式的“含义”。但是,有一点需要注意的是,所有正常的ASCII字符都在0-127范围内。因此,您可以使用signed char
类型将合法值限制为0-127范围,并将小于0的任何内容定义为错误。
例如,如果我有一个搜索某些ASCII文本并返回最常出现的字符的函数,也许我可能会定义一个负的返回值,表示有两个或更多字符绑定最频繁。这不一定是做事的好方法,这只是我头脑中的一个例子。
答案 4 :(得分:2)
请注意使用 plain 字符作为数组索引。
char buf[10000];
fgets(buf, sizeof buf, stdin);
unsigned charcount[UCHAR_MAX] = {0};
char *p = buf;
while (*p) {
charcount[*p]++; /* if (*p < 0) BOOM! */
// charcount[(unsigned char)*p]++;
p++;
}
答案 5 :(得分:1)
值得注意的是,char是signed char和unsigned char的不同类型。
答案 6 :(得分:0)
在C和C ++中,字符可以是有符号或无符号的。 char变量可用于保存小整数值。由于以下几个原因,这很有用:
在C中,字符文字是一个整数常量。 '0'等于48.
答案 7 :(得分:0)
在C中,char
(包括signed char
和unsigned char
)用于存储字节,C标准将其定义为小整数至少8位。
具有有符号和无符号字节与具有较大整数一样有用。如果你在一个数组中存储了大量的小数字(0..255表示无符号,-127..127表示signed [1]),你可能更喜欢使用字节而不是比如短整数,以节省空间。
历史上,字节和文本字符几乎是一样的。然后有人意识到语言多于英语。现在,文本要复杂得多,但在C中更改char
类型的名称为时已晚。
[1] -128..127对于带负数的二进制补码表示的机器,但C标准不保证。