(C语言篇)数据的存储

一、关于类型

1. 整数类型

在这里插入图片描述

注:整型 int 无符号数用%u打印,如果用%d打印还是有符号数 例:

#include <stdio.h>

int main() {
	unsigned int n = 5;
	printf("%d\n", n);
	n = -5;
	printf("%d\n", n);
	return 0;
}

其结果为:
在这里插入图片描述但此时n = -5时 n 实际的值为4294967291:
在这里插入图片描述通过调试监视我们可以看到n确实是4294967291。


采用%u打印:

int main() {
	unsigned int n = 5;
	printf("%u\n", n);
	n = -5;
	printf("%u\n", n);
	return 0;
}

结果为:
在这里插入图片描述当然这里的4294967291怎么来的我们后面理解整型的存储就会明白了。此处把unsinged 去掉结果都是一样的



2. 浮点型

在这里插入图片描述

3.构造类型

构造类型也叫自定义类型
在这里插入图片描述
其中数组类型如:
在这里插入图片描述
当改变其大小时就等于构造一个不一样的类型


4.指针类型

在这里插入图片描述

二、整数类型在内存中的存储


1. 整型的二进制表示有三种分别为:原码、反码、补码
2. 而内存中存储的是二进制补码,同时两个数加减是利用补码进行计算而不是原码。

在这里插入图片描述我们来看看其在编译器下是怎么存储的
在这里插入图片描述

数据在内存中是以二进制存储的,在编译器下一般是以十六进制展示出来的,四个二进制位等于一个十六进制位。这里我们先对10进行分析
在这里插入图片描述所以它在内存中的存储就是这样的,至于为什么到着放进去下面会讲到


我们再来看看负数的内存中的存储:
在这里插入图片描述

在这里插入图片描述由以上可以发现整型在内存中存储都是补码


三、大小端字节序存储

此内容解释了为什么二进制是倒着放进去的


在这里插入图片描述在这里插入图片描述

四、练习

讲到这里我们就可以上一些练习来讲解一下了

1.上面的 -5 用%u打印为什么是4294967291

int main() {
	unsigned int n = -5;
	printf("%u\n", n);
	return 0;
}

在这里插入图片描述这里我们可以利用计算器取算一下结果
在这里插入图片描述



2.计算以下下结果

int main() {
	char a = -1;
	unsigned char b = -1;
	printf("a=%d b=%d\n", a, b);
	return 0;
}

在这里插入图片描述我们来看看运行结果:
在这里插入图片描述


3. 计算出以下结果

int main() {
	char a = -128;
	printf("%u\n",a);
	return 0;
}

在这里插入图片描述运行结果;
在这里插入图片描述当然这题可以改成这样:

int main() {
	unsigned char a = -128;
	printf("%d\n",a);
	return 0;
}

结果又为什么呢,原理和第二题是一样的自己可以去试试



4.计算出以下结果

int main() {
	unsigned int i;
	for (i = 9; i >= 0; i-- ) {
		printf("%u\n", i);
	}
	return 0;
}

在这里插入图片描述这题为死循环,这是为什么呢,让我们来研究以下,
当循环十次后此时 i-- 后变为 i = -1,而 i 为无符号的整型,此时 i 应为 11111111111111111111111111111111(4,294,967,295) ,最终又会回到0,所以会陷入死循环



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

在这里插入图片描述在这里插入图片描述而64位则是:
在这里插入图片描述

IEEE 754对有效数字M和指数E,还有一些特别规定。
1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。


关于指数E
如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0-2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,8位加127,11位加1023。总结来说就是当指数为2^1,需要加上127变为128,即10000000


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

  1. E不全为0或1
    即利用以上规则计算

  2. E全为0
    当E全为0时,即原来的E在没有加入中间数时就是-127或-1023,这是一个很小的数,如 :
    在这里插入图片描述

  3. E全为1
    道理是一样的,当E全为1时,即为最大值255,减去127后,E为128,当指数为128时是一个很大的数,趋于无穷。

上面不是很懂的可以看看下面这题练习,做了就会了。

#include <stdio.h>

int main() {
	int n = 9;
	float *pFloat = (float *)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

在这里插入图片描述我们来看看运行结果是否一样:
在这里插入图片描述

好了数据的存储就讲到这里了,如果对你有用的话可以收藏一下哦。当然发现错误的话和不足的地方可以及时联系博主告知,谢谢 ^ _ ^.

  • 50
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 46
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没完没了的麦当

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

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

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

打赏作者

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

抵扣说明:

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

余额充值