数据的存储(C语言/C#)

1、数据类型的介绍

基本数据类型有:char 、short 、 int 、long 、long 、 float 、double 

基本数据类型归类:

整形:  char (unsigned char  、 signed char )

             short(unsigned short [int] 、 signed short [int])

             int    (unsigned int 、 signed int)
             long(unsigned long [int]、signed long [int])
浮点型 :float 、 double 、 long dou
构造类型
数组类型 例如:arr[5];
结构体类型
枚举类型 enum
联合类型 union
指针类型:
int *a ;
char *a ;
float* a ;
void* a ;
空类型
void (表示类型为空)
用于函数的返回类型、函数的参数、指针类型

2、整形在内存中的存储 

2.1原码、反码、补码

正数的原反补码 相同
例如:5的原反补码用32位二进制表示为0000 0000 0000 0000 0000 0000 0000 0101
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码。
计算机在 存储 有符号整数时,通常使用 补码形式 (存储)。在进行 算术运算 时,也是基于 补码 进行的,运算结果以补码形式表示,展示给用户看的是 原码
内存中的存储:整型变量a 、b
int main()
{
	//20
	//0000 0000 0000 0000 0000 0000 0001 0100(正数的原反补相同,符号位为0)
	int a = 20;                          //——>0x00 00 00 00 00 00 01 40 
	//-10
	//1000 0000 0000 0000 0000 0000 0000 1010 补码(直接转成二进制,负数符号位为1)
	//1111 1111 1111 1111 1111 1111 1111 0101 反码(原码基础之上,符号位不变,其余位取反)
	//1111 1111 1111 1111 1111 1111 1111 0110 补码(反码+1)
	int b = -10;//在内存中的存储是 补码  ——>  0xff ff ff ff ff ff ff f6
}

为什么反着放呢?(14 00 00 00...)

因为这是小端存储。下面进行大端、小端介绍

2.2 大小端介绍

大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中。
如何判断是大端还是小端?
int check_sys()
{
	int i = 1;
//*是解引用操作符,它会从 (char*)& i 所指向的内存地址(即 i 的起始内存地址)读取1字节的数据
	return (*(char*)&i);
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

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

它们在内存中的存储遵循IEEE 754标准,

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0V为正数;当S=1V为负数。
M表示有效数字,大于等于1,小于2
2^E表示指数位。
32 位的浮点数,最高的 1 位是符号位 s ,接着的 8 位是指数 E ,剩下的 23 位为有效数字 M
64 位的浮点数,最高的 1 位是符号位 S ,接着的 11 位是指数 E ,剩下的 52 位为有效数字 M

float 类型
符号位(Sign)S:占1位,位于最高位。0表示正数,1表示负数。
指数位(Exponent)E:

占8位,指数采用移码表示,偏移量为127。比如实际指数为3,存储的指数值就是3 + 127 = 130,即二进制的1000 80010。
占11位,偏移量为1023。比如实际指数为3,存储的指数值就是3 + 1023 = 1026,即二进制的100 0000 0010。
尾数位(Mantissa)M:占23位,用于表示小数部分。规定有效数字最高位总是1,这个1默认不存储,比如对于 小数1.101实际存储的是101,在计算时会自动加上前面省略的1
上栗子:float a = 5.5;
1、转成二进制:5.5 = 101.1  (整数部分的数字直接转成二进制,小数部分1——>0.5X2=1.0    , 小数部分正好等于0,停止转换)
2、 符号位S为0 ;
3、 指数E为2(这个2是101.1转成科学记数法1.011,向左移动了 2位);
4、 指数E偏移 float类型,指数偏移127,即↓;
5、 指数E转成二进制 ,2+127=129——>129转成二进制为10000001;
6、 尾数位M:1.011  的  011  00000000000000000000(尾数M占23位不够补0)
因此,float类型在内存中存储二进制形式为:
0 10000001 011 0000 0000 0000 0000 0000

double 类型,符号位占1位,指数位占11位,偏移量为1023,尾数位占52位。
 
例如,对于浮点数 3.125 ,转换为二进制是 11.001 ,即 1.1001×2^1 。符号位为0,指数为1,存储的指数值为1 + 127 = 128,即二进制的10000000,尾数位为1001后面补19个0。所以在内存中存储的二进制形式为 0 10000000 10010000000000000000000 。
E在内存中取出分为三种情况:
1、E不全为0 或 E不全为1
当指数E处于00000001到11111110之间,5.5在内存中按正常规格化数处理,先将存储的二进制位按符号位、指数位、尾数位解析,通过公式(-1)^S x 1.M x 2^E -127计算出值,再取出。
2、E全为0
E=1-126    或者  E=1-1023(1023是double的E,E有11位)
有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于
0 的很小的数字。
3、全为1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天学习了么!?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值