数据的储存

目录

一、数据类型

1.基本内置类型

2.数据类型的基本归类

二、整型在内存中的存储

1.原码、反码、补码

2.大小端存储

3.笔试题

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

1.储存规则

2.储存示例详解

3.浮点型数据的取出


一、数据类型

1.基本内置类型

char

字符型

1byte

%c

short

短整型

2bytes

%d

int

整形

4bytes

%d

long

长整型

>=4bytes

%ld

long long

更长的整形

8bytes

%lld

float

单精度浮点型

4bytes

%f

double

双精度浮点型

8bytes

%lf

类型的意义:

(1)使用这个类型开辟内存空间的大小

(2)如何看待内存空间的视角

2.数据类型的基本归类

类型集合名称

数据类型

整形家族

char

unsigned char

signed char

short

unsigned short

signed short

int

unsigned int

signed int

long

unsigned long

signed long

浮点数家族

float

double

构造类型

数组类型

联合类型 union

结构体类型 struct

枚举类型 enum

指针类型

int *pi;

char *pc;

float* pf;

void* pv;

空类型

void

二、整型在内存中的存储

1.原码、反码、补码

计算机中的整数有三种2进制表示方法,即原码、反码和补码。

三种表示方法均有符号位和数值位两部分,左边的第一位二进制位为符号位,用0表示数字为正,用1表示数字为负。

非负整数的原、反、补码都相同,负整数的原、反、补码遵循以下规则。

(1)原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

(2)反码:原码除符号位全部按位取反。

(3)补码:反码加一得到补码。

对于整形来说:数据存放内存中其实存放的是补码,并且在处理器运算中进行处理的也是补码。

并且,神奇的是,如果你用同样的方式处理负数的补码,它又会变回原码。

果然,还是我的智商不够用了。

2.大小端存储

(1)大小端存储的定义

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

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

数据低位与高位:1000000000000

(2)大小端储存的方式

我们在C代码中定义一个int类型的变量a,并观察一下内存中的数据储存情况。

这就是整形数据的大小端存储方法,虽然存储方式不同但是在使用变量时编译器会按顺序还原数据,但通过指针修改变量时并不会按顺序重组数据。

数据的存储方式只与电脑硬件设备有关,对于我们平常接触到的计算机而言,绝大部分都遵循小端存储方式。

3.笔试题

判断当前机器的大小端

#include<stdio.h>
int main()
{
    printf("小端\n");
    return 0;
}
//没了




















//▄︻┻┳═一…… ☆(>○<)
//救命呀,我不皮了!!!!!!

//真代码:╰(*°▽°*)╯
#include<stdio.h>
int check_sys()
{
	int i = 1;
	//0000 0000 0000 0000 0000 0000 0000 0001
	//大端存储:0x 00 00 00 01   解引用->0
	//小端存储:0x 01 00 00 00   解引用->1
	return (*(char*)&i);
	//&i取出i的地址,然后把这个int*类型的地址转化为char*,最后解引用
	//为大端存储,返回0;小端存储,返回1
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

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

1.储存规则

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以用以下公式表示:

  • 公式:(-1)^S * M * 2^E
  • (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2。
  • 2^E表示指数位。
  • 在float类型中,首比特位为符号位,后面8个比特位储存E,最后的23个比特位储存M
  • 在double类型中,首比特位为符号位,后面11个比特位储存E,最后的52个比特位储存M

2.储存示例详解

比如说,我们定义一个float变量,它的值为5.5

(1)确定符号位为0还是1

5.5是一个正数,所以符号位为0,也对应-1的0次方为1

(2)将该数字由十进制转化为二进制

其中从小数点向左的位数依次表示2的0次方,2的1次方,2的2次方等等;而从小数点向右的位数依次表示2的-1次方,2的-2次方,2的-3次方等等。也就是说,5.5可以表示为2的平方加2的0次方再加上2的-1次方:5.5 -> 101.1

(3)确定M与E的值

由于M是一个大于1小于2的数字,所以对于101.1可以看作1.011乘以2的平方,此时我们就确定了M=1.011,E=2,但是由于M大于1小于2的特性,M小数点前面的一不会储存在内存中,这样就可以最大利用空间来保证精度。

(4)E的存储

由于浮点型数据在储存E时只能存储为无符号整数,所以在浮点数类型中储存的E是它的计算值,计算值等于真实值加上中间值,在float类型中中间值为127,double类型中中间值为1023

E的真实值为2,变量为float类型,储存在内存中的值为129:10000001

这就是float类型的5.5的储存情况:

符号位(S)

指数位(E)

有效数字(M)

0

10000001

01100000000000000000000

(5)我们在使用浮点型数据中经常会说到精度,就证明有些浮点型数据是不能在内存中精确储存的。

比如说,我们定义一个float类型的变量并化为二进制数:3.6 ->11.100110011001100110011001100110011001100110011001101

这个数字的M早就超过了可以存储的位数,这个数字就不能准确储存,这也是我们在在形容浮点数时强调精度的原因。

3.浮点型数据的取出

然而,指数E从内存中取出还可以再分成三种情况:

(1)E不全为0或不全为1

这时,浮点数就采用上面的规则表示,即先找到符号位,然后指数E的计算值减去127(或1023),得到真实值,再将

有效数字M前加上第一位的1。

(2)E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,

有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于

0的很小的数字。

(3)E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值