数据在内存中的存储——深层解析

数据在内存中的存储——深层解析

:two_hearts::two_hearts::two_hearts:我们已经对C语言进行了一些学习与探讨,但==数据到底是如何在内存中存储==的我们是否知道,这里就应该画上一个大大的问号了???你真的知道吗?

一、数据类型的分类

==char== 字符型

==short== 短整型

==int== 整形

==long== 长整形

==long long== 更长的整形

==float== 单精度浮点数

==double== 双精度浮点数

为什么数据会分这么多类型,为什么不只统计定义一个使用?C语言有没有字符串类型.

类型的意义:1.使用不同的类型开辟的空间大小不同(使用范围)2.在内存中存储方式不同.

1.1.类型的归类

整形:char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int]

浮点数:floatdouble

构造类型:数组类型结构体 struct枚举类型 enum联合类型 union

指针类型:int *pchar *pfloat *pvoid *p

二、整形的存储

int a=10;

int b=-20;

我们仅仅知道整形在内存中分配四个空间,那么它是怎么在内存中怎么分配存储的尼?

2.1.原反补码

对于一个数,计算机要使用一定的编码方式进行存储。 原码,反码,补码是机器存储一个具体数字的编码方式

原码:数值直接翻译成二进制反码:符号位不变,其他位按位取反补码:反码+1

为什么数据在内存中不直接存储原码,还要大动干戈转化为补码在进行存储?我们看下官方的答案:

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

我们可以看到a,b分别以补码的形式在内存中存储

2.2.大小端的介绍

那什么是大小端存储尼?

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

:sunglasses: :sunglasses: :sunglasses:根据上面的分析,那么我们的整形在内存中是以大端的方式存储还是小端的方式存储尼?

我们以b=-20为例进行分析可以分析到,我们数据的低位存在内存的低地址中,符合小端存储方式,那么我们整数大部分都是以小端的方式在内存中存储

2.3.如何用代码判断大小端存储

#define _CRT_SECURE_NO_WARNINGS 1

#include

int check_s() {

int n = 1;

return *(char*)&n;

}

int main() {

int r = check_s();

if (r == 1) {

printf("小端存储\n");

}

else

printf("大端存储\n");

return 0;

}

2.4.经典再现

//输出什么?

#include

int main()

{

char a= -1;

signed char b=-1;

unsigned char c=-1;

printf("a=%d,b=%d,c=%d",a,b,c);

return 0; }

:grey_question::grey_question::grey_question:

不会有人天真的以为这个会输出三个-1吧,结果如下:

#include

int main()

{

char a = -128;

printf("%u\n",a);

return 0; }

:grey_question::grey_question::grey_question:

不会又有人天真的以为这个会输出三个-128吧,结果如下:

输出时为无符号输出,默认这个数是整数,而不是负数,所以才会输出一个很大的正数

:sunny::sunny::sunny:这一期的==数据在内存中如何存储==就到这里了,如果大家感到有帮助的话,记得一键三连哦.

相关文章

365bet官网开户网址 中国光棍最多省份排行榜_手机网易网
365现金app下载 英雄纹章全地图通关攻略 详细流程解析
beat365手机版官方网站正规 吴碧霞有多高呢?吴碧霞是谁个人资料家庭背景作品介绍