【问题标题】:significance of negative values of type char in CC中char类型负值的意义
【发布时间】:2010-12-28 19:00:19
【问题描述】:
  1. “C”中的字符用于表示字符。
  2. 代表所有代码页中字符的数字始终为正数。

签名字符有什么用? chars 中包含的负值是否仅用作比 int 和 short 更小的整数数据类型中的整数值?他们没有其他解释吗??(比如代表字符的字符中的正值)

【问题讨论】:

    标签: c character chars


    【解决方案1】:

    值得注意的是,char 是与signed char 和unsigned char 不同的类型。

    【讨论】:

      【解决方案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++;
      }
      

      【讨论】:

        【解决方案3】:

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

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

        从历史上看,一个字节和一个文本字符几乎是一回事。然后有人意识到有比英语更多的语言。这些天来,文本要复杂得多,但是在 C 中更改 char 类型的名称已经太晚了。

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

        【讨论】:

        • 实际上,术语“字节”在任何地方都没有定义。在 C/C++ 中,字符是位序列,任何对象也是如此。但是int 是“执行环境架构建议的自然大小”(C++11 §3.9.1/2)。因此标准可能定义术语机器字,而不是机器字节。 char 甚至不是最小的可寻址内存单元。例如,要定义一个 4 位字符,请使用 struct char4 { unsigned int c : 4; }
        【解决方案4】:

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

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

        您必须区分“普通”char 类型和 signed charunsigned char 类型:signed charunsigned char 是以下适用的普通整数类型 (C99, 6.5. 2 §5):

        声明为 signed char 类型的对象占用的存储量与 ''plain'' 字符对象。

        【讨论】:

        • 此外,如果 char 在您的平台上签名,并且您读取的字符的代码点大于 CHAR_MAX(比如 ISO-8859-1 中的 æ 之类的字符,其代码点为 @987654328 @),你很可能得到一个负的 char 值。
        【解决方案5】:

        所有代码页中表示字符的数字始终为正数。

        呃……错误!?

        来自 C99 标准,强调我的:

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

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

        【讨论】:

          【解决方案6】:

          在 C 和 C++ 中,字符可以是有符号或无符号的。 char 变量可用于保存一个小的整数值。这很有用有几个原因:

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

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

          【讨论】:

          【解决方案7】:

          来自Jack Klein's Home Page

          Signed char 可以保存在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有3种类型:unsigned charsigned charchar。前两个是显式的,用于操作最小的数值数据类型。但是,char 是实现定义的,无论它是有符号的还是无符号的。总之,当符号显着时,添加限定符。
          【解决方案8】:

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

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

          【讨论】:

          • 如果您的意思是它们是唯一保证 sizeof(type) 为 1 的类型,是的。它们不保证是 8 位。
          • C 唯一能说明 char 大小的是 1。它没有说明 1 的单位是什么。
          • PDP-10,例如,使用 9 位字节。
          • C89 和 C99 标准确实保证 char 至少为 8 位。可能更多,可能已签名或未签名。
          • @DavidThornley 它们保证是 CHAR_BIT 位,并且 CHAR_BIT 是已知的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-15
          • 1970-01-01
          • 2012-07-19
          • 2012-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多