C语言进阶之旅(10)数据存储

文章目录

  • 思维导图
  • 数据存储(总汇)
      • 整型
      • 构造类型
      • 指针类型
      • 空类型
      • 浮点型
  • 整型
    • 大小端问题
        • 拓展判断编译器大小端
  • 浮点型
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8(float)
  • 总结

思维导图

C语言进阶之旅(10)数据存储_第1张图片
思维导图原图


数据存储(总汇)

  • 你需要什么类型,就创建一个对应的变量,而创建变量是在内存中开辟一块空间,大小根据类型

整型

  • 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)

指针类型

  1. (32/64)平台4/8
  2. 指针不管什么类型他内存只有4个字节
  3. 指针详解
  • char
  • int
  • short
  • float
  • double

空类型

  • 用与函数传参
  • 函数返回值
  • 空指针

浮点型

  • float
  • double

整型

  • 数据存在内存中存的数二进制数
  • 然后还有原,反,补的概念
  • 存的是补码
  • 展示的原吗
  • 正数原反补相同
  • 负数才有需要换算

C语言进阶之旅(10)数据存储_第2张图片


代码:

int main()
{
     
	int A = 1;
	int b = -1;
	return 0;
}

换算:

  • A的二进制
  • B的二进制
    C语言进阶之旅(10)数据存储_第3张图片
  • B是负数所以需要进行原 反 补这一操作
    C语言进阶之旅(10)数据存储_第4张图片

猜想:

计算机存的二进制展示的是16进制
C语言进阶之旅(10)数据存储_第5张图片

  • 在细一点的
    C语言进阶之旅(10)数据存储_第6张图片

这里发现emmm我们猜想和内存中些许差异,这就引出了大小存的概念了

大小端问题

  • 为啥有大小端?
  • 应为一个地址单于对应的一个字节是8bit,你存char就直接放就好了,可是你存别的类型呢short ,int哪些超过8bit的存入就需要一个安排的问题了
  • 每个编译器不一样
  • 大端存储
    C语言进阶之旅(10)数据存储_第7张图片
  • 小端存储
    C语言进阶之旅(10)数据存储_第8张图片
  • 如何看变量在内存中的存储
    高位看从左往右看
    C语言进阶之旅(10)数据存储_第9张图片

拓展判断编译器大小端

  • 变量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

C语言进阶之旅(10)数据存储_第10张图片


float a=5.5;

C语言进阶之旅(10)数据存储_第11张图片

E为啥要+127,
(folat127)/double(1023)

  • 应为,E可能是负数0.5—>2^-1次方
  • 为了指数部分精度更高他里面全部是无符号位,这里全是有效位
  • IEE 754规定E存的时候要加一个中间值
    取出时-127

M也和放的时候不一样

  • 应为的范围是1<=M<2
  • 每次存入都是有1,那么就舍弃他位了能存更多一位,精度更高
    取出是补上

取出:

  1. E不为全0也不为全1
  2. 取出 E-128=E
  3. 依旧以5.5为例子
  4. E=129-128=2
  5. M拿出来补1
  6. 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;
}

二进制:
C语言进阶之旅(10)数据存储_第12张图片

2
  • 易错点(类型转换)
  • 提升看原来的类型,你提升是负数,打印是无符,就全部都是有效位
int main() 
{
     
    char a = -128;
    printf("%u\n", a);
    return 0;
}

二进制:

C语言进阶之旅(10)数据存储_第13张图片

3
  • 易错点(char最多存8位,最高位是符号位,提升也是符号位)

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

二进制:
C语言进阶之旅(10)数据存储_第14张图片

4
  • 易错点(我把他(二进制)看成数学的来减)
  • 算好多次没算出来。。。。
  • 直接加然后换回去源码其实就是答案。。。
int main()
{
     
	int a = 20;
	unsigned b = -10;
	int c = a - b;
	return 0;
}

二进制
C语言进阶之旅(10)数据存储_第15张图片

5
  • 易错点,搞清楚无符
unsigned i;
for(i = 9; i >= 0; i--)
{
     
    printf("%u\n",i);
}

二进制
C语言进阶之旅(10)数据存储_第16张图片

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; }

解析:
C语言进阶之旅(10)数据存储_第17张图片

7
  • 易错点
  • 搞清楚无符char的范围0~255
#include 
unsigned char i = 0;
int main()
{
     
    for(i = 0;i<=255;i++)
    {
     
        printf("hello world\n");
    }
return 0; }

解析:
C语言进阶之旅(10)数据存储_第18张图片

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)
    C语言进阶之旅(10)数据存储_第19张图片
  • printf("*pFloat的值为:%f\n",*pFloat)
    整型的形式存浮点型形式打印(0)C语言进阶之旅(10)数据存储_第20张图片

*pFloat = 9.0;

  • printf(“num的值为:%d\n”,n);
    存是浮点型,打印是整型,那么值个值很大
    C语言进阶之旅(10)数据存储_第21张图片
  • printf("*pFloat的值为:%f\n",*pFloat);
    浮点型存,浮点型取
    这里就是9.0了不多说了

总结

  • 一句话:当你熟知的哪些名字都将离去了,那么时代的接力棒就要交到我们的手上


    有错误请直接指出,私信,或者评论区,或加qq(1696912943)


    持续更新…………

你可能感兴趣的:(c语言,c语言)