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
的大小?
答案 0 :(得分:6)
编译器负责所有操作。操作系统只运行生成的二进制文件。
话虽这么说,编译器通常会制作一个操作系统可以使用的可执行文件,因此这里存在一些相互作用。由于int
的大小并不重要,只要它们是一致的 ,您就会发现变化。
换句话说,如果内核期望long int
为8字节(由于其编译方式),那么您将希望以这种方式进行编译以匹配,否则编译的代码将不匹配,并且没有共享库将起作用。
答案 1 :(得分:4)
操作系统/体系结构的Application Binary Interface指定基本类型的大小:
ABI涵盖了诸如(炸雷)的详细信息:
- 处理器指令集(具有寄存器文件结构,堆栈组织,内存访问类型等详细信息)
- 处理器可以直接访问的基本数据类型的大小,布局和对齐方式
- 调用约定,它控制如何传递函数的参数以及如何检索返回值;例如,是否全部 参数在堆栈上传递或某些在寄存器中传递, 哪些寄存器用于哪些功能参数,以及是否 在栈上传递的第一个函数参数首先被压入或 最后进入堆栈
- 应用程序应如何对操作系统进行系统调用,以及如果ABI指定直接系统调用而不是过程 调用系统调用存根,系统调用号码
- ,对于完整的操作系统ABI,则为目标文件,程序库等的二进制格式。
答案 2 :(得分:3)
这留给实施人员自行决定。
实现(编译器和标准库)定义了long
,int
和所有其他类型的大小。
只要符合标准给出的约束,实现就可以决定类型的大小(可能是指针除外)。
答案 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.h
和stdint.h
的内容以查看类型是否足够大,或者使用int32_t
(uint8_t
,{{1} }等)。