C中数据类型的大小是否取决于操作系统?
例如,C中数据类型的大小是否取决于操作系统?,c,types,C,Types,例如,int在32位操作系统上需要4个字节,但在64位操作系统上需要8个字节,C中是否存在这种情况?是的。对于int的大小和系统调用的含义,这正是“特定于平台的定义”的含义 它们不仅取决于操作系统,还取决于目标硬件和编译器配置。C数据类型大小取决于编译器实现的内存模型。根据ILP(Int、Long、Pointer)和指定的位数来考虑 因此,使用ILP64数据模型的编译器将Int、Long和指针都设置为64位。但是LP64数据模型将Int设置为32位,Long和指针设置为64位 编译器编写人员将尝
int
在32位操作系统上需要4个字节,但在64位操作系统上需要8个字节,C中是否存在这种情况?是的。对于int
的大小和系统调用的含义,这正是“特定于平台的定义”的含义
它们不仅取决于操作系统,还取决于目标硬件和编译器配置。C数据类型大小取决于编译器实现的内存模型。根据ILP(Int、Long、Pointer)和指定的位数来考虑 因此,使用ILP64数据模型的编译器将Int、Long和指针都设置为64位。但是LP64数据模型将Int设置为32位,Long和指针设置为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 );
}
#包括
#定义字节大小8
真空总管(真空)
{
int sizeof_int=sizeof(int)*字节大小;
int sizeof_long=sizeof(long)*字节大小;
int sizeof_ptr=sizeof(&sizeof_int)*字节大小;
printf(“int的大小:%d,长:%d,指针:%d\n”,
sizeof_int、sizeof_long、sizeof_ptr);
}
在我运行64位Debian Squeeze的64位AMD Pc上,它显示GCC正在使用和LP64数据模型。此数据模型是最常见的64位数据模型,因为许多主要UNIX供应商在1995年同意在此基础上进行标准化。他们这样做是为了帮助过渡,确保可移植性和互操作性,并最大限度地提高性能。这可能取决于操作系统,但更典型的是取决于硬件。许多微控制器仍然使用16位int:s,因为这是设备自然处理的内容
当我们讨论这个问题的时候。这不仅影响
int
类型,还影响表达式的求值方式。其原理是,对每个表达式进行求值,就好像它将以int
精度或更高的精度进行求值一样。例如,给定两个16位short
变量a
和b
以及long
变量x
,表达式x=a*b
将根据int
的大小产生不同的结果,即使所有涉及的变量都没有类型int
,您能稍微验证一下您的答案吗?!它如何同时依赖于编译器、操作系统和目标硬件time@ArmiaWagdy带有x64处理器的计算机可以同时运行32位和64位操作系统(比如Win32和Win8)。除此之外,64位操作系统上的编译器可以选择将long
定义为32位(就像visual studio那样)或者像64位(GCC)那样。除此之外,您还可以将编译器设置为生成32位可执行文件或64位可执行文件。它如何依赖于硬件?例如,如果我使用AVR 8位,int的大小也将是8位,我指的是使用的微控制器。在您的例子中,AVR通常使用16位(而不是8位)int:s,而ARM使用32位。为了提高可移植性,您可以将字节大小
定义为\define BYTE\u SIZE CHAR\u bit
,其中中定义的字符位
,正好是每个字节的位数。