2

I have written this code:

#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;
}

And I get this result:

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

I am confused.

First, why does a char hold 4 byte memory (should it only take one?)?

And why does a float only take 4 byte memory? I think it will transform to double automatically. And a double takes 8 bytes.

PS: I use SUSE and GCC.

4

3 回答 3

2
  1. 字节不是位。
  2. char 只保存一个字节,由于padding ,下一个变量存储在 4 字节地址之外。
  3. float 在大多数现代系统上占用 4 个字节。它与转换为 double 无关。
于 2013-08-03T13:41:14.100 回答
2

为什么 char 持有 4 位内存(应该只需要一个吗?)?

它没有。char按照 C 标准的规定,总是正好是一个字节宽。(是什么让你认为它有 4 个字节长?)

和 。为什么 float 只占用 4 位内存?

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

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


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

于 2013-08-03T13:34:06.393 回答
0

我对你的问题感到困惑。因此,我在回答上述问题时假设您的真正意思是字节,而您的意思是位。

First.Why char 持有4位内存(应该只需要一个吗?)?

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

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

和 。为什么 float 只占用 4 位内存?我认为它会转变为双自动!蚂蚁双取8位!

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

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

于 2013-08-03T15:06:35.170 回答