Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 值是如何存储在内存中的?_C_Memory_Bit - Fatal编程技术网

C 值是如何存储在内存中的?

C 值是如何存储在内存中的?,c,memory,bit,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

我编写了以下代码:

#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
我很困惑

首先,为什么一个字符只需要一个字节就可以拥有4字节的内存

为什么一个浮点数只占用4字节的内存?我想它会自动转换成双倍。一个double需要8个字节

PS:我使用SUSE和GCC

为什么字符可以保存4位内存?应该只保存一位吗

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

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

我想你是说4字节?没有一致的C实现有4位类型,最小的类型是至少8位宽的char。同样,在大多数现代系统上,float是32位和4字节,假设是8位字节单精度IEEE-754浮点数,double是64位8字节双精度IEEE-754浮点数

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

但不管怎样,你从哪里得到的尺寸信息?我没有看到你在任何地方使用sizeof操作符

为什么字符可以保存4位内存?应该只保存一位吗

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

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

我想你是说4字节?没有一致的C实现有4位类型,最小的类型是至少8位宽的char。同样,在大多数现代系统上,float是32位和4字节,假设是8位字节单精度IEEE-754浮点数,double是64位8字节双精度IEEE-754浮点数

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

但不管怎样,你从哪里得到的尺寸信息?我没有看到你在任何地方使用sizeof操作符

字节不是位。 char只保存一个字节,下一个变量存储在4字节以外的地址,因为。 在大多数现代系统上,float占用了4个字节。这与转换为双精度无关。 字节不是位。 char只保存一个字节,下一个变量存储在4字节以外的地址,因为。 在大多数现代系统上,float占用了4个字节。这与转换为双精度无关。
我被你的问题弄糊涂了。所以,我的回答假设你在上面的问题中指的是位,而你指的是字节

首先,为什么字符可以保存4位内存?应该只保存一位吗

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

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

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

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


编译器以4字节的字分配地址,因为计算机每次访问内存一个字以提高效率。一般规则是,在这种情况下,4字节的“访问长度”必须至少是最小大小的原语数据类型的大小,即char-1字节长度,我被你的问题弄糊涂了。所以,我的回答假设你在上面的问题中指的是位,而你指的是字节

首先,为什么字符可以保存4位内存?应该只保存一位吗

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

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

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

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



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

请参见输出内存地址。字符保持4位!我只是糊涂了。发生了。@LidongGuo,你怎么会认为char占了4个字节?它不…静态字符=0x804a034静态浮点=0x804a038@LidongGuo但它不。。。它的内存地址太高,需要4个字节来表示,这并不意味着它的大小是4个字节宽。。。那些绝对没有关系@李东国由于编译器在char和float变量之间插入了填充,使它们都可以从单词边界开始,所以变量的地址相隔4个字节。这是特定于实现的,但通常允许更快地访问变量。请参阅输出内存地址。字符保持4位!我只是糊涂了。发生了。@LidongGuo,你怎么会认为char占了4个字节?它不…静态字符=0x804a034静态浮点=0x804a038@LidongGuo但它不。。。它的内存地址太高,需要4个字节来表示,这并不意味着它的大小是4个字节宽。。。那些绝对没有关系@李东国由于编译器在char和float变量之间插入了填充,使它们都可以从单词边界开始,所以变量的地址相隔4个字节。这是特定于实现的,但通常允许更快地访问变量。当打印地址(如printf…%x…)时,更好、正确的格式说明符是printf…%p…。我是这里的新手。有人能解释下一票吗?NMDV不是我的下一票,而是你使用bit when byte意味着根本缺乏基础知识,因此你为什么要关心更高层次的问题,比如可变位置/大小。我认为您的位/字节是ESL的问题,与您的问题并不真正相关。@chux谢谢。我会注意这些细节。提供源代码的目的是,人们可以在答案中编辑它,插入或删除行,或者在家中复制粘贴,以向您展示编译器对旧版本或新版本的处理方式。编号行阻止所有这些使用。当打印地址如printf…%x…,一个更好和正确的格式说明符是printf…%p…。我是这里的新人。有人能解释下一票吗?NMDV不是我的下一票,而是你使用bit when byte意味着根本缺乏基础知识,因此你为什么要关心更高层次的问题,比如可变位置/大小。我认为您的位/字节是ESL的问题,与您的问题并不真正相关。@chux谢谢。我会注意这些细节。提供源代码的目的是,人们可以在答案中编辑它,插入或删除行,或者在家中复制粘贴,以向您展示编译器对旧版本或新版本的处理方式。编号线可防止所有这些用途。