【问题标题】:Does the size of the integer or any other data types in C dependent on the underlying architecture?C 中整数或任何其他数据类型的大小是否取决于底层架构?
【发布时间】:2012-07-08 00:07:04
【问题描述】:
#include<stdio.h>

int main()
{
  int c; 
  return 0;
} // on Intel architecture

#include <stdio.h>

int main()
{
  int c; 
  return 0;
}// on AMD architecture

/* 在这里,我在两台不同的机器上有一个代码,我想知道“数据类型的大小是否取决于机器” */

【问题讨论】:

  • 不同机器的尺寸肯定会有所不同。例如long 在 Windows 上是 32 位,在 Linux 上是 64 位。
  • Intel 和 AMD 不是架构。他们是供应商。 x86 是一种架构。
  • @DietrichEpp:嗯,是的,他们不是......有时会错过单词

标签: c architecture types integer size


【解决方案1】:

是的。基本数据类型的大小取决于底层 CPU 架构。 ISO C(和 C++)仅保证数据类型的 mininum 大小。

但对于同一 CPU,编译器供应商之间的情况并不一致。考虑到有用于 Intel x386 CPU 的具有 32 位长整数的编译器,以及为您提供 64 位长整数的其他编译器。

并且不要忘记在 Intel 286 机器时代,MS 程序员不得不面对的十年左右的痛苦,编译器强加给我们的所有不同的“内存模型”。 16 位指针与 32 位分段指针。我很高兴那些日子已经一去不复返了。

【讨论】:

    【解决方案2】:

    快速回答:是的,主要是,但是...

    C 中类型的大小取决于编译器编写者的决定,并符合标准的要求。

    编译器编写者的决定往往受到 CPU 架构的强烈影响。例如,C 标准说:

    “普通”int 对象具有由 执行环境的架构。

    虽然这留下了很大的判断空间。

    此类决定还可能受到其他考虑因素的影响,例如与来自同一供应商的其他架构的编译器的兼容性以及为每种支持的大小设置类型的便利性。例如,在 64 位系统上,int 的明显“自然大小”是 64 位,但许多编译器仍然有 32 位 int。 (对于 8 位 char 和 64 位 intshort 可能是 16 位或 32 位,并且您不能拥有涵盖这两种大小的基本整数类型。)

    (C99 引入了“扩展整数类型”,可以解决覆盖所有支持大小的问题,但我不知道有哪个编译器实现了它们。)

    【讨论】:

      【解决方案3】:

      出于性能原因,它通常会这样做。 C 标准定义了所有类型的最小值范围,例如 charshortintlonglong long 及其无符号对应项。

      但是,对于大多数 x86 编译器来说,Intel 和 AMD 的 x86 CPU 本质上是相同的硬件。至少,它们向程序员公开了相同的寄存器和指令,并且它们中的大多数操作相同(如果我们考虑官方定义和记录的内容)。

      无论如何,编译器或其开发人员可以使用任何其他大小,不一定要与目标硬件上的自然操作数大小相匹配,只要该大小符合 C 标准。

      【讨论】:

        【解决方案4】:

        请看这里: size guarantee for integral/arithmetic types in C and C++

        基本的 C 类型大小取决于实现(编译器)和体系结构,但是它们有一些保证的边界。因此,不应该对类型大小进行硬编码,而是使用 sizeof(TYPENAME) 来获取它们的字节长度。

        【讨论】:

        • 如果你真的对可移植性感兴趣,你还应该注意字节在不同平台上也可以有不同的大小。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        相关资源
        最近更新 更多