C中char类型的负值的重要性

时间:2009-12-21 15:50:21

标签: c character chars

  1. “C”中的字符用于表示字符。
  2. 代表所有代码页中字符的数字始终为正数。
  3. 签名字符有什么用?字符中包含的负值仅用作较小的整数数据类型中的整数值而不是int和short ??他们没有其他解释吗?(如表示字符的字符中的正值)

8 个答案:

答案 0 :(得分:11)

  

'C'中的字符用于表示字符。

并非总是如此,字符用于表示字节,它们是c中已知大小的唯一类型。

答案 1 :(得分:4)

  

代表所有代码页中字符的数字总是正数。

呃... 错误!?

从C99标准来看,强调我的:

  

如果基本执行字符集的成员存储在char对象中,则其值保证为正。

不保证所有代码页的所有有效字符都是正数。 char是签名还是无符号是实现定义的!

答案 2 :(得分:4)

只保证基本执行字符集的字符为非负(C99,6.5.2§3):

  

声明为char类型的对象是   大到足以存储任何成员   基本执行字符集。如果   基本执行的成员   字符集存储在char中   对象,其值保证   非负。如果有任何其他角色   存储在char对象中,由此产生   value是实现定义的但是   应在数值范围内   可以用那种类型表示。

您必须在“普通”char类型与类型signed charunsigned char之间进行区分:signed charunsigned char是普通的整数类型以下内容(C99,6.5.2§5):

  

声明为signed signed char类型的对象占用与a相同的存储量   ''普通''char对象。

答案 3 :(得分:2)

来自Jack Klein's Home Page

  

有符号字符可以包含在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变量可用于保存小整数值。由于以下几个原因,这很有用:

  • 在小型机器上,例如一个8位微。它可能允许更有效的访问和操作。
  • 如果你想拥有一大堆小值,比如说100K,你可以通过使用一个字符数组来节省一堆内存,而不是。例如整数。

在C中,字符文字是一个整数常量。 '0'等于48.

答案 7 :(得分:0)

在C中,char(包括signed charunsigned char)用于存储字节,C标准将其定义为小整数至少8位。

具有有符号和无符号字节与具有较大整数一样有用。如果你在一个数组中存储了大量的小数字(0..255表示无符号,-127..127表示signed [1]),你可能更喜欢使用字节而不是比如短整数,以节省空间。

历史上,字节和文本字符几乎是一样的。然后有人意识到语言多于英语。现在,文本要复杂得多,但在C中更改char类型的名称为时已晚。

[1] -128..127对于带负数的二进制补码表示的机器,但C标准不保证。