C中数据类型的大小是否取决于操作系统?

时间:2011-03-23 06:42:49

标签: c types

例如,int在32位操作系统上占用4个字节,在64位操作系统上占用8个字节,C中是否存在这种情况?

3 个答案:

答案 0 :(得分:6)

是。对于诸如int的大小和系统调用的含义之类的事情,这正是“特定于平台的定义”的含义。

它们不仅依赖于操作系统,还依赖于目标硬件和编译器配置。

答案 1 :(得分:2)

C数据类型大小取决于编译器实现的内存模型。考虑ILP(Int,Long,Pointer)以及用于指定的位数。

因此,使用ILP64数据模型的编译器将Int,Long和Pointer都设置为64位。但是LP64数据模型将Int设置为32位,Long和Pointer设置为64位。

编译器编写者将尝试使用最适合目标平台的数据模型。但是还必须考虑移植库的难度,以及编译用于不同数据模型的源代码。

您可以使用以下内容轻松查看正在使用的数据模型:

#include <stdio.h>                                                                                                                                                                 
#define BYTE_SIZE 8

void main(void)
{

  int sizeof_int = sizeof(int) * BYTE_SIZE;
  int sizeof_long = sizeof(long) * BYTE_SIZE;
  int sizeof_ptr = sizeof(&sizeof_int) * BYTE_SIZE;

  printf("Size of int: %d, long: %d, pointer: %d\n",
         sizeof_int, sizeof_long, sizeof_ptr );
}

在运行64位Debian Squeeze的64位AMD Pc上,它显示GCC正在使用和LP64数据模型。这种数据模型是最常见的64位数据模型,因为它同意在1995年由许多主要的UNIX供应商对此进行标准化。他们这样做是为了帮助过渡,确保可移植性和互操作性并最大限度地提高性能。

答案 2 :(得分:2)

它可能取决于操作系统,但更典型的是它取决于硬件。许多微控制器仍然使用16位int:s,因为这是设备自然处理的。

虽然我们在这个问题上。这不仅会影响int类型,还会影响表达式的计算方式。原则是每个表达式都被评估为好像它以int精度或更大的精度进行评估。例如,给定两个16位short变量ab以及long变量x,表达式x = a*b将产生不同的结果取决于int的大小,即使所涉及的变量都没有类型int