- 'C' 中的字符用于表示字符。
- 在所有代码页中表示字符的数字始终为正数。
有签名的字符有什么用?chars 中包含的负值是否仅用作比 int 和 short 更小的整数数据类型中的整数值?他们没有其他解释吗??(就像代表字符的字符中的正值)
'C' 中的字符用于表示字符。
并非总是,字符用于表示字节,它们是 c 中唯一具有已知大小的类型。
只有基本执行字符集的字符才能保证为非负数(C99,6.5.2 §3):
声明为 char 类型的对象大到足以存储基本执行字符集的任何成员。如果基本执行字符集的成员存储在 char 对象中,则其值保证为非负数。如果任何其他字符存储在 char 对象中,则结果值是实现定义的,但应在该类型可以表示的值范围内。
您必须区分“普通”char
类型和类型signed char
以及unsigned char
:signed char
并且unsigned char
是以下适用的普通整数类型(C99,6.5.2 §5):
声明为 signed char 类型的对象占用与“普通”字符对象相同的存储量。
在所有代码页中表示字符的数字始终为正数。
呃……错了!?
从 C99 标准,强调我的:
如果基本执行字符集的成员存储在 char 对象中,则其值保证为正数。
不能保证所有代码页的所有有效字符都是正数。是有符号还是char
无符号是实现定义的!
请注意不要使用普通字符作为数组索引。
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++;
}
有符号字符可以保存在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 文本并返回最常出现的字符的函数,也许我可以定义一个负返回值来表示有两个或多个字符与最常出现的字符相关联。这不一定是做事的好方法,这只是我脑海中的一个例子。
值得注意的是,char 是与signed char 和unsigned char 不同的类型。
在 C 和 C++ 中,字符可以是有符号或无符号的。char 变量可用于保存一个小的整数值。这很有用有几个原因:
在 C 中,字符文字是一个整数常量。“0”等于 48。
在 C 中,a char
(包括signed char
and unsigned char
)用于存储byte,C 标准将其定义为大小至少为 8 位的小整数。
有符号和无符号字节与拥有更大的整数一样有用。如果您要在数组中存储大量小数(0..255 用于无符号,-127..127 用于有符号[1]),您可能更喜欢使用字节而不是短整数,以节省空间。
从历史上看,一个字节和一个文本字符几乎是一回事。然后有人意识到有比英语更多的语言。这些天来,文本要复杂得多,但是char
在 C 中更改类型的名称为时已晚。
[1] -128..127 对于负数的二进制补码表示的机器,但 C 标准不保证这一点。