【问题标题】:C Programming Data TypesC 编程数据类型
【发布时间】:2010-10-23 14:08:45
【问题描述】:

有人问了一个问题,我不确定我是否给出了准确的答案。 问题是,为什么使用int,为什么不使用char,为什么它们是分开的?都保留在内存中,还有位,为什么数据类型有类别?

谁能解释一下?

【问题讨论】:

    标签: c types


    【解决方案1】:

    char 是最小的可寻址内存块——非常适合处理数据缓冲区,但不能保存超过 256 个不同的值(如果 char 通常是 8 位),因此对于数字不是很好计算。 int 通常比 char 大——更适合计算,但不太适合字节级操作。

    【讨论】:

    • 对于 C 来说,char 是 8 位的通常是不正确的。它只是很常见,但不是由语言以任何方式规定或保证的。请参阅 和 CHAR_BIT。
    • 嗯,ANSI C 语言定义保证 char 至少为 8 位,但理论上它可能更大。
    • 我曾经做过一个 CPU 设计,其中 sizeof(char)、sizeof(short)、sizeof(int)、sizeof(long) 和 sizeof(float) 都是 1。有 那时存在,CHAR_BIT 应该是 32。幸运的是,对于大多数程序员的理智来说,客户放弃了该项目,它从未去任何地方。
    • sizeof 以字节为单位返回大小,不是吗?因此 sizeof(char) == 1 对于任何将 char 实现为一个字节的系统(无论是 8 位、7 位还是更疯狂的)都是正确的。
    【解决方案2】:

    该标准对 charint 的限制很少:

    • char 必须能够保存 ASCII 值,即最小 7 位(编辑:根据 C 标准,CHAR_BIT 至少为 8)。它也是最小的可寻址内存块。

    • int 至少为 16 位宽,并且是“推荐的”默认整数类型。此建议留给实现(您的 C 编译器)。

    【讨论】:

    • 从 C 标准 6.2.5.3 中挖掘出来:声明为 char 类型的对象大到足以存储基本执行字符集的任何成员。如果基本执行字符集的成员存储在 char 对象中,则其值保证为非负数。如果任何其他字符存储在 char 对象中,则结果值由实现定义,但应在该类型可表示的值范围内。
    • 5.2.4.2.1 说:不是位域(字节)的最小对象的位数 - CHAR_BIT 8。这意味着“字符”中必须至少有 8 位值(但它可以是有符号或无符号的)。
    【解决方案3】:

    请记住,C 有时被用作高级汇编语言 - 与低级硬件交互。您需要数据类型来匹配机器级功能,例如字节宽度的 I/O 寄存器。

    来自Wikipedia, C (programming language)

    C 的主要用途是“系统编程”,包括实现操作系统和嵌入式系统应用程序,因为它结合了诸如代码可移植性和效率、访问特定硬件地址的能力、将类型“双关”匹配外部强加的数据访问要求,以及对系统资源的低运行时需求。

    【讨论】:

      【解决方案4】:

      过去,计算机的内存很少。这就是您拥有不同数据类型的主要原因。如果您需要一个仅保存小数字的变量,则可以使用 8 位 char 而不是 32 位长。但是,今天的内存很便宜。因此,这个原因现在不太适用,但无论如何都卡住了。

      但是,请记住,每个处理器都有一个默认数据类型,即它以特定宽度(通常为 32 位)运行。因此,如果您使用 8 位字符,则需要将该值扩展到 32 位并再次返回以进行计算。这实际上可能会稍微减慢您的算法。

      【讨论】:

        【解决方案5】:

        int 是“自然”整数类型,您应该将它用于大多数计算。

        char本质上是一个字节;它是可寻址的最小内存单元。 char不是在所有平台上都是 8 位宽,尽管大多数时候都是这样。

        【讨论】:

          【解决方案6】:

          一般来说,有一些算法和设计是抽象的,而数据类型有助于实现这些抽象。例如 - 权重很有可能通常表示为一个有理数,它可以最好地以浮点/双精度形式在存储中实现,即一个具有精度部分的数字。

          我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2012-07-25
            • 2011-07-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-24
            相关资源
            最近更新 更多