我写了这段代码:
#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。
答案 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)
答案 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字节长度)