Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中数据类型的大小是否取决于操作系统?_C_Types - Fatal编程技术网

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
,其中
中定义的
字符位
,正好是每个字节的位数。