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

121 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天 在这里插入图片描述

@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:这一期的==数据在内存中如何存储==就到这里了,如果大家感到有帮助的话,记得一键三连哦.