C语言进阶之旅(10)数据存储
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅(10)数据存储相关的知识,希望对你有一定的参考价值。
思维导图
数据存储(总汇)
- 你需要什么类型,就创建一个对应的变量,而创建变量是在内存中开辟一块空间,大小根据类型
整型
- unsigned(无符)
- signed(有符)
- char存的是对应ASSIC中的数
char
- unsigned char
- signed chae
int
- unsigned int
- signed int
short
- unsigned short
- signed short
long
- unsigned long
- signed long
long long
- unsigned long long
- signed long. long
构造类型
- 构造类型==自己定义类型
- 数组
- 结构体(struct)
- 枚举 (enum)
- 联合 (union)
指针类型
- (32/64)平台4/8
- 指针不管什么类型他内存只有4个字节
- 指针详解
- char
- int
- short
- float
- double
空类型
- 用与函数传参
- 函数返回值
- 空指针
浮点型
- float
- double
整型
- 数据存在内存中存的数二进制数
- 然后还有原,反,补的概念
- 存的是补码
- 展示的原吗
- 正数原反补相同
- 负数才有需要换算
代码:
int main()
{
int A = 1;
int b = -1;
return 0;
}
换算:
- A的二进制
- B的二进制
- B是负数所以需要进行原 反 补这一操作
猜想:
计算机存的二进制展示的是16进制
- 在细一点的
这里发现emmm我们猜想和内存中些许差异,这就引出了大小存的概念了
大小端问题
- 为啥有大小端?
- 应为一个地址单于对应的一个字节是8bit,你存char就直接放就好了,可是你存别的类型呢short ,int哪些超过8bit的存入就需要一个安排的问题了
- 每个编译器不一样
- 大端存储
- 小端存储
- 如何看变量在内存中的存储
高位看从左往右看
拓展判断编译器大小端
- 变量1
- 判断二进制最后一位是否是1就可以
- 指针类型
int a= 1;
char *pa=(char *)&a;
if(*pa==1)
{
printf("小")
}
else
{
printf("大");
}
浮点型
他的存储根据IEEE 75电气协会规定
- (-1)^S+M+E
- 符号位(Sign):S=0为正数,S=1为负数
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):1<= m >2
float a=5.5;
E为啥要+127,
(folat127)/double(1023)
- 应为,E可能是负数0.5—>2^-1次方
- 为了指数部分精度更高他里面全部是无符号位,这里全是有效位
- IEE 754规定E存的时候要加一个中间值
取出时-127
M也和放的时候不一样
- 应为的范围是1<=M<2
- 每次存入都是有1,那么就舍弃他位了能存更多一位,精度更高
取出是补上
取出:
- E不为全0也不为全1
- 取出 E-128=E
- 依旧以5.5为例子
- E=129-128=2
- M拿出来补1
- M=1.011
(-1)^S*M *2^E------>者就是取出的结果
全0,全1
全0
- E存入的时候是+127,那么E=-127,
- 2^-127,你算算这个多少
- 2^-1次方是2/1
- 那么这个数就是无限接近0
全一同理的
题
1
- 易错点(c)
- 注意他是有符号还是无符
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);
return 0;
}
二进制:
2
- 易错点(类型转换)
- 提升看原来的类型,你提升是负数,打印是无符,就全部都是有效位
int main()
{
char a = -128;
printf("%u\\n", a);
return 0;
}
二进制:
3
- 易错点(char最多存8位,最高位是符号位,提升也是符号位)
int main() {
char a = 128;
printf("%u\\n",a);
return 0;
}
二进制:
4
- 易错点(我把他(二进制)看成数学的来减)
- 算好多次没算出来。。。。
- 直接加然后换回去源码其实就是答案。。。
int main()
{
int a = 20;
unsigned b = -10;
int c = a - b;
return 0;
}
二进制
5
- 易错点,搞清楚无符
unsigned i;
for(i = 9; i >= 0; i--)
{
printf("%u\\n",i);
}
二进制
6
- 易错点
- 搞清楚stlen的计算(stlen碰到\\0结束,并计算他之前的元素个数,数字0==\\0)
- 搞清楚char的存储范围-128~127
int main() {
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0; }
解析:
7
- 易错点
- 搞清楚无符char的范围0~255
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\\n");
}
return 0; }
解析:
8(float)
int main() {
int n = 9;
float *pFloat = (float *)&n; //把int变量n的地址强制类型转换成float
printf("n的值为:%d\\n",n); //9
printf("*pFloat的值为:%f\\n",*pFloat);//0。0000
*pFloat = 9.0;
printf("num的值为:%d\\n",n);//存
printf("*pFloat的值为:%f\\n",*pFloat);
return 0;
}
代码解析
- printf(“n的值为:%d\\n”,n);
整型值,整型打印(9)
- printf("*pFloat的值为:%f\\n",*pFloat)
整型的形式存浮点型形式打印(0)
*pFloat = 9.0;
- printf(“num的值为:%d\\n”,n);
存是浮点型,打印是整型,那么值个值很大
- printf("*pFloat的值为:%f\\n",*pFloat);
浮点型存,浮点型取
这里就是9.0了不多说了
总结
- 一句话:当你熟知的哪些名字都将离去了,那么时代的接力棒就要交到我们的手上
有错误请直接指出,私信,或者评论区,或加qq(1696912943)
持续更新…………
以上是关于C语言进阶之旅(10)数据存储的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段