【问题标题】:Size of memory allocated for float in C在 C 中为浮点分配的内存大小
【发布时间】:2021-06-05 09:35:46
【问题描述】:
#include <stdio.h>
#define max_size 100

float array[max_size];
int n,counter;

int main(){
    printf("Enter the size of the array...\n");
    scanf("%d",&n);

    for (counter=0; counter<n; counter++){
        printf("%p\t",&array[counter]);
    }
    printf("\n\n");

    return 0;
}

我只是在试验这个 C 程序,并试图验证浮点数的大小是否为 8 个字节。但是在使用数组中的 5 个元素运行此代码时,我得到这些元素的地址如下:

Enter the size of the array...
5
0x555555755040  0x555555755044  0x555555755048  0x55555575504c  0x555555755050

正如您看到的第一个浮点数,我的系统分配了内存空间 ...40,41,42,43,如果我没记错的话,这是 4 位空间。但是 float 数据类型应该有 8 个字节的空间。我在想程序应该为 2 个字节的空间分配内存空间 ...40,41,...4F。所以

...40-...4F //for first 2 bytes
...50-...5F //for second 2 bytes 
...60-...6F //for third 2 bytes 
...70-...7F //for last 2 bytes

所以第二个地址将从 ...80 开始。但这不是我得到的结果。我在这个过程中缺少什么?谢谢你的帮助!!

【问题讨论】:

  • sizeof (float)sizeof *arraysizeof array[0]
  • 几乎所有环境都对float 使用IEEE-754 单精度,对double 使用IEEE-754 双精度。几十年来一直如此。这意味着sizeof(float) 是 4,除非您使用的是非常不寻常的系统。
  • 40 - 4F 是 16 个字节。地址是字节地址。看起来您认为地址引用了一位。也许这就是你的困惑(除了期望 sizeof(float) 是 8。
  • @PaulHankin 这意味着每个地址由 8 位组成。类似于为一组 8 人分配组名。
  • 是的,内存中每个地址存储1个字节。如果您有一个 4 字节的值(例如 float),它将跨越 4 个地址,例如 0x55551230 - 0x55551233。 (在非常罕见的系统上,一个字节可能没有 8 位,浮点数可能不是 4 个字节)。

标签: c memory-address


【解决方案1】:

C 标准没有说明 float 的存储大小,并且故意将其留给实现者。

可能在您的系统和编译器上大小为 4。您可以使用 sizeof(float) 进行检查。另见this discussion

【讨论】:

  • 这是正确答案。不同类型的大小因系统而异。
  • sizeof(float) 返回 4 我猜这意味着 4 个字节。但输出对我来说仍然没有意义。
  • @G-aura-V 可能您无法理解的原因在于您的问题“但浮点数据类型应该有 8 个字节的空间”是错误的 - 通常它会是4字节。如果你做 size(double) 它很可能是 8,而 C 不保证它的浮点数是 4 个字节,并且几乎所有架构都是双 8。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2016-02-29
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多