【C语言】 数据在内存中的存储

本文详细介绍了计算机中的数据类型,特别是整型和浮点类型的内存存储机制,包括原码、反码和补码的区别,以及大小端存储和IEEE754标准在浮点数存储中的应用。还涵盖了数组、结构体、指针等构造类型和空类型的介绍。

1.数据类型介绍

char        //字符数据类型
short       //短整型
int         //整形
long        //长整型
long long   //更长的整形
float       //单精度浮点数
double      //双精度浮点数

类型的意义:
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]

浮点数家族:

float
double

构造类型:

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

指针类型:

int *pi;//整形指针
char *pc;//字符整形指针
float* pf;//单精度浮点指针
void* pv;//空指针

空类型:
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型

2. 整形在内存中的存储

比如:

int a = 20;
int b = -10;

我们知道为 a 分配四个字节的空间。
那如何存储?
下来了解下面的概念:

2.1 原码、反码、补码

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

原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码
反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是"补码"。
为什么呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统
一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程
是相同的,不需要额外的硬件电路。
根据上面的原码、反码、补码的结论,我们先猜想这两个整形

在这里插入图片描述

2.2大小端存储

博客链接

2.3练习

练习1

在这里插入图片描述
答案:
在这里插入图片描述
分析:
在这里插入图片描述

a:以整型的方式打印
补码:11111111111111111111111111111111
反码:11111111111111111111111111111110
原码:10000000000000000000000000000001  --> -1
b:以整型的方式打印
补码:11111111111111111111111111111111
反码:11111111111111111111111111111110
原码:10000000000000000000000000000001  --> -1
c:以整型的方式打印
补码:00000000000000000000000011111111
反码:00000000000000000000000011111111
原码:00000000000000000000000011111111 --> 255

练习2

在这里插入图片描述
答案:
在这里插入图片描述

分析:

原码:10000000000000000000000100000000
反码:11111111111111111111111011111111
补码:11111111111111111111111100000000
实际存储:10000000
以无符号整型的方式打印
补码:11111111111111111111111100000000
对于无符号整型,其原码、反码和补码都等于其二进制表示本身。由于没有符号位,所以无符号整型只能表示非负整数。
反码:11111111111111111111111100000000
补码:11111111111111111111111100000000

在这里插入图片描述

练习3

在这里插入图片描述
答案:
和上面的一样
在这里插入图片描述
分析:

原码:00000000000000000000000010000000 
反码:01111111111111111111111011111111
补码:01111111111111111111111100000000
实际存储:10000000
以无符号整型的方式打印
补码:11111111111111111111111100000000
对于无符号整型,其原码、反码和补码都等于其二进制表示本身。
由于没有符号位,所以无符号整型只能表示非负整数。
反码:11111111111111111111111100000000
补码:11111111111111111111111100000000

练习4

在这里插入图片描述
输出结果应该是个死循环
结果应该是9,8,7,6,5,4,3,2,1,0,4294967295(无符号整形的最大)…
这里的问题出现在条件的设置上,条件改为i>0即可避免
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习5

在这里插入图片描述
答案:
-10

分析:

i在内存中的存储:
原码:10000000000000000000000000010100
反码:11111111111111111111111111101011 
补码:11111111111111111111111111101100
j在内存中的存储:
原码:00000000000000000000000000010100
反码:00000000000000000000000000010100
补码:00000000000000000000000000010100
i+j 补码相加
补码:11111111111111111111111111110110
反码:10000000000000000000000000001001
原码:10000000000000000000000000001010 --> -10

3.浮点类型在内存中的存储

浮点数存储的例子:
在这里插入图片描述
结果:
在这里插入图片描述
在之前的学习中,我们知道整形和单精度浮点数的存储空间均为4个字节,但是通过这段代码,我们不难看出浮点数和整形在内存中的存储可能并不相同。

3.1浮点数的存储规则

浮点数的存储规则遵循IEEE 754标准,它定义了浮点数的表示和运算规则。根据该标准,浮点数由三个组成部分构成:符号位、指数位和尾数位。

符号位(Sign):用于表示浮点数的正负性,其中0表示正数,1表示负数。

指数位(Exponent):用于表示浮点数的指数部分。一般情况下,指数位是一个带有偏移量的二进制整数。通过使用偏移量,可以表示负指数和较大的正指数。例如,偏移量为127的8位指数位可以表示范围为-126到127的指数值。

尾数位(Mantissa/Fraction):用于表示浮点数的小数部分或者有效数字。尾数位是一个二进制小数,通常规范化为形如1.xxxxx的形式(其中xxxxx表示二进制小数)。规范化的浮点数可以通过移动小数点的位置来表示不同大小的数值。
内存布局:
1位符号位(Sign)+ 8位指数位(Exponent)+ 23位尾数位(Mantissa)

根据上述规则,浮点数可以表示为以下形式:

在这里插入图片描述

其中:

S 表示符号位(0表示正数,1表示负数)。
M 表示尾数位。
E 表示指数位。
具体的浮点数存储规则取决于浮点数的位数。在IEEE 754标准中,常见的浮点数位数包括单精度(32位)和双精度(64位)。单精度浮点数使用1个符号位、8个指数位和23个尾数位,而双精度浮点数使用1个符号位、11个指数位和52个尾数位。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_hd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值