我以前读过几次,C中的数据类型的长度取决于PC上的体系结构。
但是最近我已经阅读了编译器的文档,这个文档指定了您可以访问的数据类型和这个数据类型的长度。
所以我的问题是,数据类型长度取决于编译器的使用,计算机的体系结构,还是两者兼而有之?
发布于 2022-11-03 11:14:16
每种类型的大小的最终确定取决于C实现,但须受C标准的约束。(这个标准指定了一些东西,比如char
是一个“字节”,一个字节是8位或更多,而且某些类型的大小是相同的。)
C实现通常由编译器、头文件、库、链接器和要运行的目标系统以及可能的其他组件组成。编译器对类型的特性有很大的影响,特别是C的核心类型,但有时头文件会完成类型的定义,因此一个编译器可以与提供不同类型的不同的头文件集一起使用。
大多数C实现都受到它们所设计的执行架构的特性的影响。int
通常与通用处理器寄存器的大小相同,而指针(任何类型的指针)通常是最小的大小,它是两个字节的幂,并且有足够的位来跨越目标体系结构的地址空间。
但是,C实现可以用于其他目的。我看到了一个C实现,它使用32位指针大小作为64位结构,目的是减少具有大量指针的程序中的内存使用。C实现还可以设计为在新处理器上运行旧的C代码,因此C实现使用了旧代码所针对的类型的大小,而不是在新处理器上使用更“自然”的大小。
发布于 2022-11-03 11:11:55
它可以依赖于任何一种。当然,编译器产生的可执行文件需要在编译时所用的CPU体系结构上高效地运行,所以如果(例如)交叉编译软件在16位微控制器上运行,那么编译代码中的sizeof(int)==2
很可能会运行,即使您使用的是现代64位桌面PC来进行编译。
同时,也要由编译器编写者(在limits中)来决定编译器中各种非宽度特定数据类型的大小。例如,一些编译器设置sizeof(int)==4
,而另一些编译器设置sizeof(int)==8
,这是由于他们自己的历史和用户的需要所特有的原因。
https://stackoverflow.com/questions/74308334
复制相似问题