数据的存储进阶

回忆:

之前学习了基本内置类型:

char 字符数据类型(1字节);short 短整型(2字节);

int 整型(4字节);long长整型(4or8字节);long long 更长整型(8or16字节);

float 单精度浮点数(32位-4字节);double 双精度浮点数(64位-8字节)

一、整型在内存中的存储

重点:

1.在vs里char是signed char(范围—128-127)负比正多一
unsigned char(范围0-255)

2.大小端字节存储:

(1)字节序–是以字节为单位,讨论存储顺序的

(2)小端字节序存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容,存放在高地址处。
大端字节序存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容,存放在低地址处。


示例:

int main()
{
	char a = -1;
	signed char b = -1;
	//负数整型提升,高位补一;正数整型提升,高位补零
	unsigned char c = -1;
	//无符号的整型提升,高位补零
	unsigned char d = -2;
	printf("%d %d %d %d\n", a, b, c,d);
	//%d-十进制的形式打印有符号型整数
	char e = -128;
	//-128
	//10000000 00000000 00000000 10000000原码
	//11111111 11111111 11111111 01111111反码
	//11111111 11111111 11111111 10000000补码
	//-128的补码
	printf("%u\n", e);
	char f = 128;
	//00000000 00000000 00000000 10000000原码
	//01111111 11111111 11111111 01111111反码
	//01111111 11111111 11111111 10000000补码
	printf("%u\n", f);
	//%d-十进制的形式打印无符号型整数
	//发生整型提升

	int i = -20;
	//1000000 00000000 00000000 00010100原码
	//1111111 11111111 11111111 11101011反码
	//1111111 11111111 11111111 11101100补码
	unsigned j = 10;
	//0000000 00000000 00000000 00001010原反补相同
	printf("%d\n", i + j);
	unsigned int k;
	//如果是int k,再减减就为-1,就不会>=0了
	for (k = 9; k >= 0; k--)
	{
		printf("%u\n", k);
		Sleep(1000);//单位毫秒
	}
	return 0;
}

3.strlen是求字符串长度的,统计的是\0之前出现的字符的个数,\0的ASCII码值是0.

4.整型的类型,表示范围:limits.h

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

重点:

整型和浮点型在内存中的存储是有差异的

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

  • (-1)^s*M*2^E
  • (-1)^s表示符号位,当S=0,V为正数,当S=1,V为负数
  • M表示有效数字,大于等于1,小于2
  • 2^E表示指数位

即:十进制的5.5,可以表示为二进制的101.1,相当于1.011*2^2

按V的格式,得出S=0,M=1.011,E=2

例:

int main()
{
	float f = 5.5;
	//101.1
	//1.011*2^2
	//(-1)^0*1.011*2^2
	//S=0
	//M=1.011
	//E=2
	//0(符号S,占1bit)10000001(E的2+127=129化二进制,占8bit)011 0000 0000 0000 0000 0000(M共占23bit,.前1省略) (在32位浮点数下)
	//重新整合
	//0100 0000 1011 0000 0000 0000 0000 0000
	//0x40b00000(16进制,小端存储)
	return 0;
}

(1)以整数去存储,浮点数去读取

(2)以浮点数去存储,整数去读取

int main()
{
	int n = 9;
	//0000 0000 0000 0000 0000 0000 0000 1001
	//0 0000 0000 0000000 00000000 00001001
	//S E         M
	//0 -126      0.00000000 00000000 0001001
	//(-1)^0*0.00000000 00000000 0001001*2^-126
	// (+—无穷接近于0)
	//E在内存中是全零
	float* pfloat = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为: %f\n", *pfloat);//0.000000
	*pfloat = 9.0;//以浮点数去存储
	//1001.0
	//1.001*2^3
	// (-1)^0*1.001*2^3
	// S=0  M=1.001 E=3
	// 0 10000010 00100000 00000000 0000000
	//
	printf("num的值为:%d\n", n);//1091567616(整型去解读)
	printf("*pFloat的值为:%f\n", *pfloat);//9.000000
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值