我是一名 C 程序员新手;这可能是一个天真的问题,但请耐心等待。我了解到
char
、short
、int
、long
、long long
、float
、double
和 long double
的存储大小取决于实现,并且可能有很大差异。当我在我的机器上使用 sizeof(long)
时,它返回了我 8 bytes
,但是当在 long long
上使用相同的函数时,它也返回了 8 bytes
。因此我想,由于我的CPU是基于X64 ISA的,它可能最多只支持64位/8字节。但是当我对 long double
使用相同的函数时,结果是 16 bytes
。
为什么
long double
可以是16字节宽,而long long
却不是?如果 long long
与 long
相同,那么拥有它还有什么意义呢?还有一个问题,当我的 CPU 的寄存器大小为 64 位时,我的 CPU 如何真正处理 128 位宽的long double
?
其他信息:我使用
gcc (GCC) 12.2.0
,如果它与编译器有关。
#include <stdio.h>
int main(void) {
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(long double));
return 0;
}
结果如下:
8
8
16
为什么long double可以是16字节宽,但不能是long long?
...当我的 CPU 的寄存器大小为 64 位时,我的 CPU 如何真正处理 128 位宽的 long double?
OP已经自我回答了。
...long long、...和 long double 的存储大小依赖于实现并且可能有很大差异
C 中
long long
和long double
之间没有固定的关系。CPU 寄存器大小仅指导 实现细节,而不是驱动它们。 8 位 CPU 可以有 256 位 long double
。
启用所有编译器警告并在打印
"%zu"
对象时使用 size_t
。
// printf("%d\n", sizeof(long double));
printf("%zu\n", sizeof(long double));