【问题标题】:If characters can hold what integers can then why is there a need to use integers?如果字符可以容纳整数,那么为什么需要使用整数?
【发布时间】:2011-04-07 08:15:27
【问题描述】:

为什么我们在 C 中使用整数?

#include<stdio.h>
int main()
{
    char c=10;
    printf("%d",c);
    return 0;
}

等同于:

#include<stdio.h>
int main()
{
    int c=10;
    printf("%d",c);
    return 0;

}

【问题讨论】:

    标签: c types


    【解决方案1】:

    从机器架构的角度来看,char 是一个可以用 8 位表示的值(非 8 位架构发生了什么?)。

    int 中的位数不固定;我相信它被定义为特定机器的“自然”值,即该机器最容易/最快操作的位数。

    如前所述,计算机中的所有值都存储为二进制位序列。这些位的解释方式各不相同。它们可以被解释为二进制数或代表其他东西的代码,例如一组字母字符,或许多其他可能性。

    最初设计 C 时,假设 256 个代码足以表示字母表中的所有字符。 (实际上,这可能不是假设,但在当时已经足够好了,设计者试图保持语言简单并与当时的机器架构相匹配)。因此 8 位值(256 种可能性)被认为足以容纳字母字符代码,并且 char 数据类型被定义为方便

    免责声明:上面写的都是我的意见或猜测。只有 C 的设计者才能真正回答这个问题。

    一个更简单但具有误导性的答案是,您不能将整数值 257 存储在 char 中,但可以存储在 int 中。 自然的

    【讨论】:

      【解决方案2】:

      char cant 可以容纳整数。不是一切。
      至少不会以您将值分配给char 的方式。 对sizeof 做一些试验,看看charint 之间是否有区别。

      如果您真的希望使用char 而不是int,您可能应该考虑使用char[],并存储以 10 为基数的 ASCII 字符表示形式的数字。 :-)

      【讨论】:

        【解决方案3】:

        从技术上讲,所有数据类型都用 0 和 1 表示。那么,如果它们在后端都相同,为什么我们需要不同的类型呢?

        嗯,类型是数据的组合,以及您可以对数据执行的操作。

        我们有ints 代表数字。他们有类似+ 的运算来计算两个数字的和,或者- 来计算差值。

        当您想到一个字符时,在通常意义上,它代表人类可读格式的一个字母或符号。能够对'A' + 'h' 求和是没有意义的。 (尽管 c 允许你这样做。)

        因此,我们有不同语言的不同类型,以使编程更容易。它们本质上封装了数据以及对其合法执行的功能/操作。

        Wikipedia 有一篇关于类型系统的好文章。

        【讨论】:

          【解决方案4】:

          从广义上讲,char 是机器上最小的敏感数据存储单元,但 int 是正常计算的“最佳”大小(例如,寄存器的大小) )。任何数据类型的大小都可以表示为chars 的数量,但不一定是ints 的数量。例如,在 Microchip 的 PIC16 上,char 是 8 位,int 是 16 位,short long 是 24 位。 (short long 必须是我遇到过的最愚蠢的类型限定符。)

          请注意,char不一定必须是 8 位,但通常是。推论:任何时候有人声称它是 8 位,有人会插话并命名一台机器,而它不是。

          【讨论】:

          • 像那个 32 位 int 和 64 位 char 的 Cray?
          • int 不是计算的“最佳”大小(不再),但只是最不合理的。这就是为什么+ 等的所有操作数在宽度较小时首先提升为int,我认为。在现代 64 位架构上,“最佳”大小主要是 64 位类型,而 int 仍保持在 32 位。这被 Al 在他的回答中提到的 int_fastN_t 类型捕获。不,我不会评论 8 位问题 ;-)
          • @Vatine:因为 C 需要 'sizeof(char)
          • @Jens Gustedt — 我不知道 64 位拱门还有 32 位 ints ... 生活和学习 :)
          • @JOnathan Leffler 我认为他们只是忽略了 C 标准的那一部分。我不认为 UTF-32 在 80 年代初中期是个大问题。
          【解决方案5】:

          因为

          #include <stdio.h>
          
          int main(int argc, char **argv)
          {
                  char c = 42424242;
                  printf("%d", c); /* Oops. */
                  return(0);
          }
          

          【讨论】:

          • 那个 Oops 也适用于 int :P 这超出了它的范围 :D
          • @fahad:我不这么认为。为什么这么说?
          • 42424242 将超出 int 范围。您可能需要很长的时间。
          • 超出标准保证int 的范围,但在任何健全的平台上都安全地在int 的大小范围内。
          【解决方案6】:

          试试这个:

          #include <stdio.h>
          int main()
          {
              int c = 300;
              printf("%d", c);
              return 0;
          }
          
          #include <stdio.h>
          int main()
          {
              char c = 300;
              printf("%d", c);
              return 0;
          }
          

          数据类型charshortintlonglong long 包含(可能)不同大小的整数,这些整数可以取值达到特定限制。 char 包含一个 8 位数字(从技术上讲,它既不是 signed 也不是 unsigned,但实际上是其中之一)。因此范围只有 256(-127 到 128 或 0 到 255)。

          良好的做法是避免使用charshortintlonglong long 并使用int8_tint16_tint32_tuint8_t 等,甚至更好: int_fast8_tint_least8_t

          【讨论】:

          • 我完全不同意这种“良好做法”。 charshortintlonglong long 都有保证的最小范围,这在大多数情况下是您需要的(主要例外是当您处理指定的二进制接口时,例如二进制文件或网络协议)。不保证提供精确宽度类型。
          • @caf:因此“更好”。对于 C99,保证提供int_fast8_tint_least8_t 等,并保证它们是至少 8 位的最快和最小(分别)可能的整数。其他尺寸也是如此。
          • 而后者,int_least8_t,保证为signed char。那么为什么不直接使用signed char
          • @R:这对signed char 来说是公平的,但对于 16 位和 32 位整数来说没有那么有用。 int_least8_t 然后具有与使用(例如)uint_fast16_t 的其余代码保持一致的优势。
          【解决方案7】:

          一个字符只能保留 8 位,而整数可以有 16、32 甚至 64 位(long long int)。

          【讨论】:

          • 或大于64位; IBM Power7 有 128 位整数寄存器。
          • @Jonathan Leffler:C 中整数类型的宽度取决于编译器,而不是机器架构。
          • @Jeremy:是的,Power7 的编译器支持 128 位整数(也支持浮点小数)。
          【解决方案8】:

          因为char 只保存 -127 到 127 之间的数字

          【讨论】:

          • 保证范围是 -127 到 127 0 到 255,因此 0 到 127 是可移植范围。
          • 这不是类型系统的“真正”原因。
          • @caf 默认情况下所有整数类型都是有符号的,不是吗?
          • @Justin 我不是在讨论类型系统的原因,而只是回答 OP 的问题。
          • @qrdl: Plain char 是特殊的 - 它可以是有符号的或无符号的(实际上是与 signed charunsigned char 不同的类型)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 2014-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多