当我的CPU(X64 ISA)时,“long double”如何占用16字节/128位存储?

问题描述 投票:0回答:1

我是一名 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
c instruction-set long-double long-long
1个回答
1
投票

为什么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));
© www.soinside.com 2019 - 2024. All rights reserved.