C中的整数或任何其他数据类型的大小是否依赖于底层架构?

时间:2012-07-08 04:46:56

标签: c architecture types integer size

#include<stdio.h>

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

#include <stdio.h>

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

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

  

“普通” int 对象具有由。建议的自然大小   执行环境的架构。

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

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

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

答案 2 :(得分:0)

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

但是,Intel和AMD的x86 CPU与大多数x86编译器的硬件基本相同。至少,它们向程序员公开相同的寄存器和指令,并且大多数操作相同(如果我们考虑正式定义和记录的内容)。

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

答案 3 :(得分:0)

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

但是对于相同的CPU,它在编译器供应商中并不一致。考虑到有针对Intel x386 CPU的32位长整数的编译器,以及为您提供64位长的其他编译器。

并且不要忘记MS程序员在英特尔286机器时代必须处理的十年左右的痛苦,以及编译器强加给我们的所有不同“内存模型”。 16位指针与32位分段指针。我很高兴那些日子已经过去了。