0
点赞
收藏
分享

微信扫一扫

什么?数据在内存存储原来这么好玩~

言午栩 2022-03-11 阅读 78


文章目录

1.数据类型的再回顾

相信各位之前都已经学习过了基本的内置类型

其中long long 类型是在c99标准以后才有的类型。

附上图片:image-20220117201057320

其中我们注意到C语言中有一个我们不常用的类型,但是和我们平常的判断有关

布尔类型:_Bool -专门用于判断真假的变量(同样是在C99标准开始以后才加入)

//_Bool 用于判断真假
#include <stdbool.h>
int main()
{
    _Bool flag = false//(false代表假,true代表真)
        if(flag)
        {
            printf("flag为真\n");
        }
    //if(flag)括号里的flag与0或非零的作用一样,起判断作用  false 等同于0   true  等同于 1
    return 0;
}

使用布尔类型时,记得引头文件<stdbool.h>

仔细去分析_Bool类型以后,发现布尔类型它只是int 类型的重命名

类型的意义:

1.使用这个类型开辟内存空间的大小(大小决定了使用范围)。

2.如何看待内存空间的视角 。

1.1数据类型的基本归类

//当我们直接使用char创建变量时候,unsigned和signed类型取决了编译器,并不是固定的,但是在vs中默认为signed char类型

何时使用unsigned int 类型呢?例:定义一个年龄变量时候,使用unsigned int age ;因为年龄恒为正数;

假设不小心使用了unsigned 类型时候存储了一个负数,它仍然会将它转化为正正数理解并非去掉负号或者符号那么简单;

当我们打印有符号整形时应该用%d打印,用无符号整形时应该用%u

image-20220117203925004

注意到,当我们使用无符号整形存储了一个-10时候,它仍然利用%d的形式直接打印了出来,疑惑来了,那他们不是没有什么区别吗?难道是我前面说了一大堆废话么,并不是,当你使用unsigned类型时候,打印时应该用的是%u,从一开始打印就错了,那么只会一错到底!

真正的情况是这样滴:

image-20220117204314784

会不会顿时觉得,哇amazing!!!,竟然从-10变成这么大一个数,简直就是翻身做地主啊。那么为什么会变化那么大呢,诶别急,后面告诉你答案。

浮点数家族:

构造类型(自定义类型):

数组类型:

例如int arr[10];int arr[5];就是两种类型,我们把函数名这里是arr除去,留下的就是类型名,这里是int 【10】 和 int 【5】 ,所以是自定义类型。

指针类型:

用于对不同类型的变量地址的存储,存储一个变量的地址时候,它们的类型是需要一一对应的。

int main()
{
    char a = 'b';
    char *pc = &a;
    return 0;
}

空类型:

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型。


2.整形在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

比如

int a = 10;
int b = -10

在创建a的变量时候,系统为a分配了4个字节的空间。那这些数据是如何存储的呢?

2.1原码、反码、补码

计算机中的整数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”

负整数的三种表示方法各不相同分别为:

正数的原、反、补码都相同。

对于整形来说:数据存放内存中其实存放的是补码。

首先一步一步来解析:

1.怎样去理解符号位和数值位呢?我用一幅图教会

image-20220117210922501

2.负数具体怎样操作?

image-20220117211613860

刚刚好像漏掉了一个问题,但是在我这篇细致到极致的文章怎么能少呢?“对于整形来说:数据存放内存中其实存放的是补码。”
为什么呢?

我通过一个加法减法的问题对这句话进行一个解释。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X5lGFVMB-1642432358813)(C:/Users/22479/AppData/Roaming/Typora/typora-user-images/image-20220117214133533.png)]

image-20220117214141043

image-20220117214216833

不得感叹到当年能想到创造出补码的人实在是太过于强大,最强大脑了属于是。在学习过程中我们也要不断保持敬畏之心!

此外刚刚那句话还提到了**“补码与原码相互转换过程是相同的”**

我们知道,原码到补码的过程是原码**—(按位取反,符号位不变)—>反码—(反码+1)—>**补码

那么我们从这句话可得:补码**—(按位取反,符号位不变)—>反码—(反码+1)—>**原码


一直在提内存内存内存,有没有什么方法让我直观的可以看到数据在内存理的存储方式?

有,必须有!!!今天高低给你整明白它!,盘它!

image-20220117220304460

首先我们在内存中开辟空间分别命名为a和b;

接下来利用vs的的调试模式观察内存里面的信息:

image-20220117221021677

image-20220117221654761

问题不对啊?红框里面明明是0a 00 00 00,顺序有点和你这也对不上啊?

2.2大小端字节序

什么是大端小端:

为什么有大端和小端:

什么低地址高地址,低位高位,我不懂怎么办?上图!

image-20220117223336696

image-20220117223502476

以上两幅图看完以后是不是简洁明了很多了呢?

2.3练习

配套这篇文章也为了让大家寒假过的没那么枯燥,我准备了配套的练习题,
点击这获取

img

举报

相关推荐

0 条评论