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

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

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

@TOC


一、数据类型的分类

==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]

浮点数:
float
double

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

指针类型:
int *p
char *p
float *p
void *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<stdio.h>
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 <stdio.h>
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 <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0; }
:grey_question::grey_question::grey_question: 不会又有人天真的以为这个会输出三个-128吧,结果如下:

在这里插入图片描述
在这里插入图片描述

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

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

目录
相关文章
|
17天前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
218 1
|
7天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
13天前
|
存储 人工智能 编译器
存算一体新兴力量:解析我国企业在存储创新、技术路径上的多元化探索
存算一体新兴力量:解析我国企业在存储创新、技术路径上的多元化探索
|
13天前
|
存储 JSON JavaScript
「Python系列」Python JSON数据解析
在Python中解析JSON数据通常使用`json`模块。`json`模块提供了将JSON格式的数据转换为Python对象(如列表、字典等)以及将Python对象转换为JSON格式的数据的方法。
29 0
|
17天前
|
存储 C语言
数据在内存中的存储2
数据在内存中的存储2
|
17天前
|
存储 编译器
数据在内存中的存储1
数据在内存中的存储
|
18天前
|
存储 算法 安全
深度解析JVM世界:JVM内存分配
深度解析JVM世界:JVM内存分配
|
1月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
14 1
|
2月前
|
存储 编译器 C语言
C语言:数据在内存中的存储形式
C语言:数据在内存中的存储形式
|
1月前
|
存储 C语言
C语言--------数据在内存中的存储
C语言--------数据在内存中的存储
26 0

推荐镜像

更多