【数据存储:揭开内存中数据存储的神秘面纱】(下)

简介: 【数据存储:揭开内存中数据存储的神秘面纱】

【数据存储:揭开内存中数据存储的神秘面纱】(上):https://developer.aliyun.com/article/1424721


七个小练习 - 巩固知识


demo1


#include <stdio.h>
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;
}



demo2


#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n", a);
    return 0;
}



demo3


#include <stdio.h>
int main()
{
    char a = 128;
    printf("%u\n", a);
    return 0;
}



demo4


#include<stdio.h>
int main()
{
  int i = -20;
  unsigned  int  j = 10;
  printf("%d\n", i + j);
  return 0;
}



demo5


#include<stdio.h>
#include<windows.h>
int main()
{
  unsigned int i;
  for (i = 9; i >= 0; i--)
  {
    printf("%u\n", i);
    Sleep(1000);
  }
  return 0;
}



demo6


#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000];
    int i;
    for (i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;
    }
    printf("%d", strlen(a));
    return 0;
}



demo7


#include <stdio.h>
unsigned char i = 0;
int main()
{
    for (i = 0; i <= 255; i++)
    {
        printf("hello world\n");
    }
    return 0;
}



浮点型在内存中的存储


  • 常见的浮点数: 3.14159 1E10
  • 浮点数家族包括: float、double、long double 类型。
  • 浮点数表示的范围:float.h中定义



浮点数存储的例子:


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


输出结果是什么呢?



Why?Why?Why?


  • num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?
  • 要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。



IEEE 754规定:



IEEE 754对有效数字M和指数E,还有一些特别规定。


  • 前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。
  • IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分。
  • 比如保存1.01的时 候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。
  • 以32位 浮点数为例,留给M只有23位, 将第一位的1舍去以后,等于可以保存24位有效数字。


至于指数E,情况就比较复杂。



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


one:



再看一个加强知识理解



two:



three:



知识讲解完毕,再解释前面的题目:


相关文章
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
317 0
|
9天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
8天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
18 1
|
13天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
15天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
43 1
|
18天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
31 2
|
22天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
35 4
|
28天前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
23天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
2月前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
46 0