【C语言】数据储存 2.0

一、数据类型的详细介绍

(一)基本的数据类型:

char

short

int

long

long long

float

double

类型的意义:

  1. 重点:看待内存空间里储存的数据(补码)的视角

2、类型决定开辟空间的大小(而大小决定使用范围)

(二)类型基本归类(整型与浮点型)

1、整型家族

char

short

int

long

long long

因为 char类型 在内存中以其 对应的ASCII码值 进行储存,所以将其归为整型一类

(三)空类型 void

二、整型在内存中的存储

前置知识:原码、反码、补码

正数的 原码、反码、补码都是一样的

负数不一样

具体见:https://note.youdao.com/s/IjruzGdM

(一)数据在内存中以补码形式储存

为什么要这样做呢?

原因在于这样便于CPU计算:CPU中只存在加法(不含其他硬件的情况下),如果要进行数据的加减乘除,补码可实现,加法与减法直接补码相加减,具有同等效力;而乘法和除法则是补码的累加与累减

(二)大小端问题

大小端定义:

大端储存模式:数据的高位储存在低地址,低位储存在高地址(顺序存放)

小端储存模式:数据的高位储存在高地址,低位储存在低地址(逆序存放)

一定要了解高低地址和函数栈帧开辟和变量空间定义的相关知识

https://note.youdao.com/s/X9gjdDel

大小端存在原因:一般的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题(简单来说就是本来数据在内存中的存储顺序可以任意,但是为了更加便利操作等问题,出现顺序和你序存放)

一般的编译器为小端存储模式(逆序存放)

如 visual stdio :见 指针初阶一、回顾内存中的那些事 中的 小点:变量数据在小端机器内存中是倒着存放的(不是数组)

https://note.youdao.com/s/CrbMAZby

经典相关例题:(百度笔试题)

简述大小端相关概念,并写一段代码判断当前机器是大端机器还是小端机器:

三、浮点型在内存中的存储

(一)浮点型存储规则

1、了解 S E M

规定 S E M 储存规则(类似于 科学技术法 )

S 表示正负(用 0 和 1)

M 表示真值(1< M < 2)

E 表示阶码(左移或右移的位数,左移后为正 右为负)

如 5.5

二进制为: (-1) ^ 0 * 101.1

(-1) ^ 0 * 1.011 * (2^ 2 )

S M E

上图中红色部分为不可修改部分(固定格式)

其中 2 ^ 2 中不可修改的 2 为二进制的权,如十进制写为 10 ^ ···

上例中的 5.5 ,S = 0 ,M = 1.011 ,E = 2

2、储存方式

在内存中的存储:

M 的储存:(二进制形式)

因为 1< M < 2(一点几几几)

所以省略小数点前的 1 ,留出位置给小数部分(可多存一位,精度更大)

二进制储存,左边开始存,后面补 0

如1.011,存入 M 相应的二进制位就是 01100000000000000000000

M 的储存位置如上,32位 和 64位 (32、64位表示 float 和 double精度,不是系统)

它们的储存位置和精度如上

E 的储存:(二进制形式)
1、E 的存入

E 存入内存中相应二进制位时,,E的值 需要加上 127 或 1023 再存入,

如浮点型 float,给 E 的二进制位有 8 位,E的取值范围是 0~255,是没有负数的(正数看待不然很麻烦),而一般来说 E 有时为负,要使它范围位于 0~255,所以在存入内存时要加上一个中间值,在国际佬们的测试和最后决定,中间值为 127

而double型 中间值是为 1023

2、E 的提取

分几种情况:

(1)E 不为 全0 或 全1(一般情况)

因为存入时加上了对应中间值 127 或 1023,那么提取时先减去中间值获得 E的真实值

(2)E 全为 0

全为0 即表示 这整个数趋近于0,E 的真实值 <= -127 ,可能比-127还更小,那现在我们就规定一下,只要出现这种 全0 的情况,就把真实值看做 -126,即 1-127

(double型就看做 -1022 ,即1-1023)

(3)E 全为 1

这时表示正负无穷大

提取步骤

(1)先提取 S,把符号先确定(避免忘记)

(2)再数后面的(float为)8位 或 (double为)11位 ,数完做好标记,避免M看错位

(3)看E是否为全0(全0 M不用加小数点前的1),再提取有效数字 M(看是否补1),根据E的值来移动小数点

(4)求出的 二进制科学计数法 还原为 十进制

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Meiyourou.c

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

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

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

打赏作者

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

抵扣说明:

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

余额充值