在C语言中,我们学习了各种数据类型以及其所占的存储空间大小
int--4个字节
float--4个字节
char--1个字节
double--8个字节
long--4个字节
指针类型由编译器决定--32位编译器占4字节;64位编译器占8字节。
一、整形存储
我们知道整形数据会分配四个字节的空间,那整形在内存中究竟是如何存储的呢?
我们需要先了解以下内容:
1、原码、反码、补码
原码--一个数字直接转换而成的二进制
反码--符号位不变,数值位取反
补码--反码+1
在计算机中,数据的运算都是以数据的补码进行的
【注】正数与无符号数据的原反补都是一样的,与原码相同。
2、大小端
2.1、字节序
概念:CPU对内存中的数据以字节为单位进行存取的顺序(因为内存有高低地址之分,数据的二进制有高低位之分)
针对的数据类型:存储单元大于一个字节的数据类型
主机字节序主要取决于CPU架构---我们常用的x86是小端模式
分类:大端--低地址存高位
小端--低地址存低位
下面来看一个实际案例
#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;
}
最终结果为
有符号数就是用最高位表示符号(正或负),其余位表示数值大小,无符号数则所有位都用于表示数的大小
二、浮点型在内存中的存储
1、小数转换成二进制:乘2取整法
2、小数在内存中存储是以浮点形式存储
因为指数位的数值有可能出现负数,但是指数域是无符号的,无法表示负数。
采用指数基数:127,真正指数位存储的数据是实际指数值+127。
专业说法叫做使用数字的移码﹣1;移码:正数的移码就是符号位取反因为浮点存储在进行浮点移动的时候,总会移动到第一个1的后边,因此所有数字的表示都是:1.xxxx
采用这种方式之后,因为尾数部分,第一个比特位总是存储1,如果把这个1忽略掉,采用这种规则,用的时候再给加上,1就不用存储了,就节省了一个比特位 。
两种特殊情况:
E为全0:这时真实指数值是1-127=-126,M表示真实值,通常用于表示正负0
E为全1:这时真实指数值是255-127=128,M为全0时表示正负无穷大
【注】32位下:S-占1个比特位;E-占8个比特位;M占23个比特位
64位下:S-占1个比特位;E-占11个比特位;M占52个比特位