什么定义类型的大小?

时间:2019-05-15 19:38:00

标签: c gcc sizeof

ISO C标准规定:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

我在BIT Linux发行版(19.1)上使用GCC-8,long int的大小为8

我正在使用一个使用GCC 7的应用程序,并且编译器是64位的。 long int的大小为4。 编译器或操作系统是否定义long int的大小?

4 个答案:

答案 0 :(得分:6)

编译器负责所有操作。操作系统只运行生成的二进制文件。

话虽这么说,编译器通常会制作一个操作系统可以使用的可执行文件,因此这里存在一些相互作用。由于int的大小并不重要,只要它们是一致的 ,您就会发现变化。

换句话说,如果内核期望long int为8字节(由于其编译方式),那么您将希望以这种方式进行编译以匹配,否则编译的代码将不匹配,并且没有共享库将起作用。

答案 1 :(得分:4)

操作系统/体系结构的Application Binary Interface指定基本类型的大小:

ABI涵盖了诸如(炸雷)的详细信息:

  
      
  • 处理器指令集(具有寄存器文件结构,堆栈组织,内存访问类型等详细信息)
  •   
  • 处理器可以直接访问的基本数据类型的大小,布局和对齐方式
  •   
  • 调用约定,它控制如何传递函数的参数以及如何检索返回值;例如,是否全部   参数在堆栈上传递或某些在寄存器中传递,   哪些寄存器用于哪些功能参数,以及是否   在栈上传递的第一个函数参数首先被压入或   最后进入堆栈
  •   
  • 应用程序应如何对操作系统进行系统调用,以及如果ABI指定直接系统调用而不是过程   调用系统调用存根,系统调用号码
  •   
  • ,对于完整的操作系统ABI,则为目标文件,程序库等的二进制格式。
  •   

答案 2 :(得分:3)

这留给实施人员自行决定。

实现(编译器和标准库)定义了longint和所有其他类型的大小。

只要符合标准给出的约束,实现就可以决定类型的大小(可能是指针除外)。

答案 3 :(得分:2)

TL / DR -确切的大小取决于编译器。


标准要求类型必须能够表示值的最小范围-例如,unsigned char必须至少能够表示 范围[0..255]int必须至少能够表示 范围[-32767...32767],依此类推。

该最小范围定义了最小位数-您至少需要 16位才能表示范围[-32767..32767](某些系统可能会使用填充位或奇偶校验位,它们是字,但不用于表示值)。

其他体系结构方面的考虑也起作用-int通常设置为,其大小与本机单词的大小相同。因此,在16位系统上,int通常是16位,而在32位系统上,int是32位。因此,最终归结于编译器。

但是,有可能让32位系统上的一个编译器使用16位int,而另一个编译器使用32位int。这导致了90年代中期的一个浪费的下午,当时我编写了一些代码,这些代码假定32位limits.h在一个编译器下可以正常工作,但在另一个编译器下可以打破常规在相同的硬件上。

因此,我们吸取了教训-切勿假设说一种类型可以代表标准所保证的最小之外的值。检查float.hstdint.h的内容以查看类型是否足够大,或者使用int32_tuint8_t,{{1} }等)。