数据类型介绍以及数据在内存中的存储
常见的数据类型有以下几种:
int
char
short
long
float
double
为什么要给数据定义不同的类型呢?
因为不同类型的数据开辟的内存空间不一样大,这样有利于节省内存
所谓类型,就是对数据分配存贮单元的安排,包括存储单元的长度(占多少个字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式
整型数据
整形数据的分类
(1)基本整型(int型)
编译系统一般会给int型数据4个字节,和long int 在内存中的表示是一样的
(2)短整型(short型)
short型一般占用两个字节,存储方式与int相同,短整型变量的值的范围是-32768~32767
(3)长整型(long int型)
long int 型也就是long型,在内存中占用4个字节,长整型变量的值的范围是-2^31~(2^31-1)即-2147483648~2147483647
整形数据的存储
整型在内存中的存储是以该数的二进制形式存储的,正数的原反补码是一样的,对于负数来说就应该先求出负数的补码。负数求补码的方法:先将此数写成二进制的形式,然后对二进制数除符号位按位取反,最后再加一。
在计算机系统中,数值一律用补码来存储存储和表示,因为补码可以将符号位和数值域统一处理,同时,加法减法也可以同时处理。
举个栗子:
5的原码:00000000 00000000 00000000 00000101
5的反码:00000000 00000000 00000000 00000101
5的补码:00000000 00000000 00000000 00000101
-5的原码:10000000 00000000 00000000 00000101
-5的反码:11111111 11111111 11111111 11111010
-5的补码:11111111 11111111 11111111 11111011
从上面的图片可以看出a和b存储的都是补码,但是顺序和我们预期的不太一样
下面介绍一下存储顺序问题:大小端
大端存储模式(大端字节序):一个数据的低位的内容放在高地址处,高位放在低地址处。
正着存
小端存储模式(小端字节序):一个数据的低位的内容放在低地址处,高位放在高地址处。
倒着存
浮点型数据
(1)float型(单精度浮点型)
单精度浮点型一般占用四个字节,数值以二进制形式存储,在存储时系统将数据分成小数部分和指数部分两个部分。c语言编译系统中以24位表示小数部分(包括符号),以8位表示指数部分(包括指数的符号)
举个栗子:
十进制的5.0 写成二进制为:101.0 相当于1.01*2^2
所以,s为符号位小数部分的符号位是0,M是小数部分是1.01,E是指数部分是2
M是小数部分,也称尾数,规定尾数的整数部分恒为1,表示为二进制为1.01*2^2,指数为2,所以127+2=129,129表示成二进制为1000 0001,所以指数部分为1000 0001,小数部分将其整数去掉为01,后面补0至23位,即为010 0000 0000 0000 0000 0000
在内存中验证
再将二进制转换成十六进制
小端存储模式,所以就可以和内存中的存储一模一样,以上说的是单精度浮点型存储到内存中,若是将内存中的存储解析出来就用上面思想的逆向思维即可,
内存中的十六进制数先转化成二进制,00 00 a0 40转化成01000000 10100000 00000000 00000000
再将二进制数划分为三部分,符号位是0表示正数,接下来的八位指数部分是1000 0001即为129,129-127=2,所以指数部分为2
剩下的23位010 0000 0000 0000 0000 0000,去掉之前补上的0,小数部分有效的数为01,加上小数部分的整数位1,所以小数部分为1.01
综上:这个浮点数为1.01*2^2,即为101,所以浮点数的整数部分是5,后面没有小数部分,而且是浮点型数据,就用0补充,所以化为十进制即为5.0
(2)double型(双精度浮点型)
double型一般占用8个字节指数部分占用11个bit,小数部分占52个bit,把上图进行扩充即可
(3)long double型(长双精度)
不同编译系统对long double的处理是不一样的,具体情况具体分析