C进阶:数据在内存中的存储(1)

news/2024/12/29 6:19:00/

 

引入:

大家好,感谢大家最近的支持,今天也是开始了C进阶一系列的博文的创作,欢迎大佬们来指点,欢迎来一起沟通!!!

数据类型的介绍

我们都知道:C语言具有以下几种数据类型:

char         //字符数据类型(大小:1字节)
short        //短整型(大小:2字节)
int          //整型(大小:4字节)
long         //长整型(大小:4/8字节)
long long    //更长的整型(大小:8字节)
float        //单精度浮点数(大小:4字节)
double       //双精度浮点数(大小:8字节)

这里注意的是:sizeof(int) <= sizeof(long),在上述类型中,我们可以通过limits.h中的(MAX和MIN)获得类型的的最大值和最小值(eg.INT_MAX和INT_MIN能够获得int类型的最大值和最小值)。

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

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

类型的基本归类

整型家族

char

        unsigned char

        signed char

short

        unsigned short[int]

        signed short[int]

int

        unsigned int

        signed int

long

        unsigned long[int]

        signed long[int]

long long

        unsigned long long[int]

        signed long long[int]

需要注意的是:在这里char类型也算是整型家族,因为字符存储的时候存储的是ASCII码值。

浮点数家族

float(小数点后六位)

double(小数点后15位)

long double(小数点后20位)

构造类型

数组类型(eg.int arr[10]的类型为int [10])

结构体类型 struct

枚举类型 enum

指针类型

int* pi

char* pc

float* pf

void* pv

空类型

void表示空类型(无类型)。

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

整形在内存中的存储

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

那么数据在开辟空间中是怎么存储的呢?

我们来看看:比如,

int a = 20;//创建一个整型类型,叫a,这时a申请了四个字节的空间来存放数据
int b = -10;

让我们来看以下概念:

原码,反码,补码

计算机中的符号有三种表示方法,即原码,反码,补码。

三种表示方法均有符号位整数位两部分:符号位(即开头的首个数字)用0来表示正数,用1来表示负数,而数值位三种表示方法各不相同。

原码

直接将数据的二进制按照正负数的形式翻译成二进制即可.

反码

将原码的符号位不变,其他位依次按位取反即可(即1变0,0变1)

补码

将反码+1即可得到补码。

对于正数来说,原码,反码,补码都相同

而对于负数来说,需要用以上方式进行转换。

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

为什么呢?是用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器,因此计算机只能做加法运算(即用补码做加法)),你们可以试试看,用补码做加法时才能得到正确结果。

举个例子:

再让我们看一下在内存中的存储:

 

我们可以看到a和b补码在内存中分别存储的是补码,但我们发现这个数据居然是反的,这是为什么? 这就涉及到了大小端

 大小端介绍

大端小端的定义

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

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

让我们来举个小栗子:

为什么会存在大端小端模式

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着一个字节(8bit)。这可以应对char类型数据的存储需求,因为char类型长度刚好是一字节,但有些类型是超过一个字节的。因此这里就存在着一个如何安排多个字节数据中各字节的存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。

如何测试当前机器是大端还是小端

我们都知道,存储方式无非就是大端和小端这两种。即:

正着存:大端存储方式;

倒着存:小端存储方式。

所以我么可以考虑一下用一个数字来测试当前机器的大小端(即用1)。

在x86环境中,1的二进制形式为00000000000000000000000000000001.

所以就无非以下两种情况:

signed和unsigned的区别

对于整型家族来说,有:有符号和无符号的区分。

unsigned char(无符号char)

signed char(有符号char)   (实际用的话编译器是哪个char不确定,vs上是signed char)

short = signed short

int = signed int

下面有个小栗子来大致区分一下unsigned和signed

signed char:01010111(其中第一个0是符号位,其余位为数值位)

unsigned char:01010111(所有位都是数值位)

再来看这两张图:

我们可以看出:(在0-255的范围内)signed char是一个这样的大致循环的形式,而unsigned char则是走了“直线”。 


http://www.ppmy.cn/news/105642.html

相关文章

【Zero to One系列】在WSL linux系统上,使用docker运行Mysql与Nacos,以及如何启动与停止WSL

前期回顾&#xff1a; 【Zero to One系列】window系统安装Linux、docker 1、下载docker-compose 1.下载&#xff1a; curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2.授予权限&a…

十、Camera 启动流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Camera 启动流程概览二、Launcher 跟Camera APP 交互三、Camera app 与FWK Camera Service 交互四、Camera FWK 与 Camera HAL 交互五、Camera FWK…

5.29-kubernetes learning

文章目录 HomeGet StartedThe kubernetes network model First of all &#xff0c;we should understand the layout of this official website page. Home The Home chapter is that the official website has manuals for different versions of k8s ,and then generally…

前端vscode插件bito

GPT-4和ChatGPT越来越火&#xff0c;前端人员是否也能在日常工作中尝试体验其带来的乐趣呢&#xff1f; 答案是可以的&#xff01;安排&#xff01;&#xff01; 今天介绍一款vscode的插件 【bito】。 安装 安装后只需要自己注册一下&#xff0c;创建一个workspace就可以使用…

发言稿怎样写?教你快速写好发言稿小技巧

发言稿是为了在特定场合向听众传达特定信息而写的一篇讲话稿。需要向听众传达自己的观点、思路、建议等&#xff0c;来达到特定的目的。发言稿的撰写应该注意措辞得体、语言简洁、重点突出。同时&#xff0c;还需要注意发言时间&#xff0c;控制好发言的篇幅和节奏。一个好的发…

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术&#xff08;内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据&#xff09;&#xff0c;测量…

Hudi Flink SQL代码示例及本地调试

前言 之前在Flink Hudi DataStream API代码示例中总结了Hudi Flink DataStream API的代码及本地调试&#xff0c;并且在文中提到其实大家用Table API更多一些&#xff0c;但是我感觉Table API调试源码可能会比较难一点&#xff0c;因为可能会涉及到SQL解析&#xff0c;不清楚T…

Jenkins环境部署

1、 Jenkins 部署 java环境准备&#xff0c;安装java-11-openjdk # yum install fontconfig java-11-openjdk -y # java -version openjdk version "11.0.17" 2022-10-18 LTS OpenJDK Runtime Environment (Red_Hat-11.0.17.0.8-2.el8_6) (build 11.0.178-LTS) Ope…