【张三学C语言之】—深入理解数据存储
一,数据类型
不同的数据类型代表了不同数据在内存中开辟的空间大小
eg:int 在内存中占4个字节
整 型 | 内容 注意:括号中的内容为每种类型所占的字节数 |
---|---|
数据类型 | char(1字节) short(2字节) int(4字节) long(8字节) |
浮点型 | float (8字节) double(16字节) |
构造类型 | 数组类型 (内存大小自己开辟决定) 结构体 struct (遵守内存对齐) 枚举 enum(内存元素决定) 联合类型 union(最大的那个元素的) |
指针类型 | void 表示类型,通常用于函数的返回类型,函数的参数,指针类型 |
C语言没有字符串类型,所以用数组来存放字符串 eg:char[10]="abcdef"
二.整型数据在内存中的存储
1.源码,反码,补码
计算机中的符号已二进制的形式在内存中存储
数据在内存中已补码的形式存储
首位为符号位,其余位为数据位
0为正,1为负
源码:直接二进制按照正负数的形式翻译二进制即可
反码:符号位不变,数据位置取反
补码:反码+1
正数:源码=反码=补码
负数:以补码形式存储
eg:
正数
date:10
bin:00000000 00000000 00000000 00001010
源码=反码=补码=00000000 00000000 00000000 00001010
负数
date:-10
bin: 10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101
补码:11111111 11111111 11111111 11110110
2.数据在内存中已补码的形式存储的原因
a.使用补码可以将符号位和数据域统一处理
b.CPU只有加法器,使用补码可以使加法和减法统一处理
3,数据存储
字节序:
概念:cpu对内存中的数据以字节为单位进行存取的顺序
因为内存的有高低地址之分,数据的二进制有高低位之分
主机字节序主要取决于cpu架构: X86-小端; MIPS-大端
字节序主要是在网络通信时,不同主机之间的通信,如果字节序不同会造成数据二义
分类:int=0x11223344
大端存储:低地址存高位 内存中的存放11 22 33 44
小端存储:低地址存低位 内存中的存放44 33 22 11
👉注:大小端在面试和考试中是高频考点,想要了解更多点击下方链接了解。
三.浮点型数据在内存中的存储
1,IEEE754 标准文档规定,任意一个浮点数在内存中的表示分三部分
符号 | 单精度浮点数每一位所占内存 | 双精度浮点数每一位所占内存 |
---|---|---|
s—符号位 | 1个比特位 | 1个比特位 |
E—指数位 | 8个比特位 | 11个比特位 |
M—尾数 | 23个比特位 | 52个比特位 |
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占 1 位二进制,表示数的正负。0表示正,1表示负
指数符占 1 位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
两种特殊情况:
E为全0:这时候真实指数值是1-127=-126,M表示真实值,通常用于表示正负0
E为全1:这时候真实指数值是255-127=128,M为全0时表示正负无穷大
2.取值范围
类型 | 比特数 | 有效数字 | 数值范围 |
---|---|---|---|
float | 32 | 6-7 | -3.410(-38)~3.410(38) |
double | 64 | 15-16 | -1.710(-308)~1.710(308) |
long double | 128 | 18-19 | -1.210(-4932)~1.210(4932) |
如果存储比精度更重要,请考虑对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。
浮点变量可以提升为更大基数的类型(从 float 类型到 double 类型)。当您对浮点变量执行算术时,通常会出现提升。此算术始终以与具有最高精度的变量一样高的精度执行。
float f_short;
double f_long;
long double f_longer;
gf_short = f_short * f_long
在前面的示例中,变量f_short提升到类型 double 并且与f_long相乘;然后,结果舍入到类型 float,然后赋给f_short。
3.应用示例分析
在 C 和 C++ 中,如下赋值语句:
float a=0.1;
编译器报错:warning C4305: ‘initializing’ : truncation from 'const double ’ to 'float ’
原因:在 C/C++ 中,上述语句等号右边 0.1,认为是个 float,但是编译器却把它认为是个 double(因为小数默认是 double),所以要报这个 warning,一般改成0.1f就没事了。
欢迎各位来交流,如果觉得有用的话,记得评论+收藏+关注哦!喵~~
今日垃圾话:长大之后才明白,世上无难事,只怕有心人。