数据在内存中的存储方式--C语言版

简介: 数据在内存中的存储方式--C语言版

1.数据类型的介绍
在C语言中有很多的内置类型,如

char //字符数据类型

short //短整型

int //整形

long //长整型

long long //更长的整形

float //单精度浮点数

double //双精度浮点数

使用这些内置类型就意味着开辟内存的大小和看待内存空间的视角,是C语言中必不可少的。

接下来,我们将它们进行分类

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]

其中char也算是整型家族的,因为char在内存中是以ASCII值得形式去存储的,可以看做是一种特殊的整型

2.浮点数家族

float

double

3.构造类型

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

4.指针类型

int pi; char pc; float pf; void pv;

5.空类型

void 表示无类型

2.整型在内存中的存储方式
计算机是如何储存整型数据的呢? 事实上,在计算机中存储整型的方式存在三种,分别是原码 反码 和 补码 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。 对于正数而言,原反补码都是一样的 对于负数而言,三者之间存在相互转化的关系

原码

直接将二进制按照正负数的形式翻译成二进制就可以。

反码

将原码的符号位不变,其他位依次按位取反就可以得到了。

补码

将反码加1即可得到

那么为什么计算机还要再负数上区分出原码反码补码的转化关系呢? 为什么对于整形来说:数据存放内存中其实存放的是补码? 为什么不直接使用原码存储,这样岂不是更加方便?

事实上,只要举一个例子就可以很好地解释上面的问题

int main()
{

int a = 1;
int b = -1;
printf("%d", a + b);
return 0;

}

复制代码
int main()
{

int a = 1;
int b = -1;
a是正数,原码反码补码相同
//00000000000000000000000000000001
//b是负数,原码反码补码需要相互转化
//10000000000000000000000000000001--原码
//11111111111111111111111111111110--反码
//11111111111111111111111111111111--补码



//假设正数负数都使用原码
//00000000000000000000000000000001  --a的原码
//10000000000000000000000000000001  --b的原码
//10000000000000000000000000000010  相加后的结果-->  -2???
// 
//11111111111111111111111111111111  --b的补码
//00000000000000000000000000000001  --a的原码
//00000000000000000000000000000000  --相加后的结果为0

return 0;

}
复制代码
通过上面的正反对比就可以知道为什么在内存中存储的是补码

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

3.大小端字节序的判断
首先,什么是大小端?

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

如图所示,更加清晰 在这里插入图片描述

那么为什么要有大小端之分呢? 简单来说,当我们的数据大于一个字节的时候,就会涉及到多个字节的顺序安排问题,由此有了大小端存储的方式。 可以通过调试时的内存窗口来查看大小端,大小端存储取决于编译器的实现方式。

目录
相关文章
|
4天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
22小时前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
23小时前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1天前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
6天前
|
C++ 容器
curl使用小记(三)——获取远端数据到内存缓冲区
curl使用小记(三)——获取远端数据到内存缓冲区
17 0
|
7天前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
|
存储 程序员 C语言
程序员之路:C语言中存储类别
程序员之路:C语言中存储类别
127 0
|
6天前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
7天前
|
C语言 C++
|
23小时前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。