【数据存储:揭开内存中数据存储的神秘面纱】(上):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:
知识讲解完毕,再解释前面的题目: