值如何存储在内存中?

时间:2013-08-03 13:26:58

标签: c memory bit

我写了这段代码:

#include "stdio.h"

static int   static_int;
static char  static_char;
static float static_float;
static char *static_pointer;
static double static_double;
static int   static_end;

int main()
{
    printf("static int      =%d\nstatic char        = %c\nstatic float      = %f\nstatic pointer    =0x%x\nstatic doub    le    =%f\n",
    static_int,static_char,static_float,static_pointer,static_double);
    printf("\n\n");
    printf("static int      =0x%x\nstatic char      =0x%x\nstatic float     =0x%x\nstatic pointer   =0x%x\nstatic_doub    le    =0x%x\nstatic end       =0x%x\n",
                  &static_int,&static_char,&static_float,&static_pointer,&static_double,&static_end);
    return 0;
}

我得到了这个结果:

static int      =0
static char     = 
static float    = 0.000000
static pointer  =0x0
static double   =0.000000


static int      =0x804a030
static char     =0x804a034
static float    =0x804a038
static pointer  =0x804a03c
static_double   =0x804a040
static end      =0x804a048

我很困惑。

首先,为什么char保存4字节内存(应该只占用一个?)?

为什么浮点只占用4字节内存?我认为它将自动转换为双倍。而double需要8个字节。

PS:我使用SUSE和GCC。

3 个答案:

答案 0 :(得分:2)

  

为什么char保持4位内存(应该只占用一个?)?

没有。根据C标准的规定,char总是正好一个字节宽。 (是什么让你觉得它长4个字节?)

  

并且。为什么浮动只占用4位内存?

我认为你的意思是4个字节?没有符合要求的C实现具有4位类型(最小类型是char,其至少为8位宽)。同样,在大多数现代系统中,float是32位(和4字节,假定为8位字节)单精度IEEE-754浮点数,double是64-位(8字节)双精度IEEE-754浮点数。

所以float通常是4个字节长 - 并且float对象的大小不会改变,即使它在传递给可变参数函数时被隐式转换为double。在C中,函数参数按值传递,因此转换为double实质上意味着double变量float副本已生成(并传递)到功能)。


(但无论如何,你在哪里获得有关尺寸的信息?我没有看到你在任何地方使用sizeof运算符......)

答案 1 :(得分:2)

  1. 字节没有位。
  2. char仅保存一个字节,由于padding,下一个变量存储在4字节地址之外。
  3. 在大多数现代系统中浮动4个字节。它与转换为double无关。

答案 2 :(得分:0)

我对你的问题感到困惑。所以,我在回答假设您在上述问题中的意思是时真的意味着字节

  

首先。为什么char保持4位内存(应该只占用一个?)?

结果中没有任何内容表明char在内存中保存了4个字节。您实际打印的是存储变量的地址。不是尺寸。编译器为char分配一个4字节的单词并不一定意味着char占用4个字节。字符仅占用分配的4字节字的1个字节,其余3个字节用零填充。 如果您正在讨论char指针,那么正如您所知,指针存储它指向的char变量的地址。这个地址是一个无符号整数,大小为4个字节。

要获取变量的大小,请使用 sizeof 运算符

  

并且。为什么浮动只占用4位内存?我认为它会变成双重自动! Ant双取8位!

Float的大小是4字节(在32位系统上)。所以编译器分配了4个字节。 double的大小总是float的两倍。因此编译器分配了一个8字节的地址空间来存储该值。我不明白为什么你认为浮动会变成双倍。该程序不需要任何此类自动转换。

编译器以4字节字的形式分配地址,因为计算机一次访问一个字以提高效率。一般规则是这个'访问长度'(在这种情况下是4个字节)必须至少是最小尺寸原始数据类型的大小(char-1字节长度)