1.数据类型
数据的类型有很多,不同的编程语言会将数据的类型分为不同的类别。但是一般的分类是两大类:基本数据类型和引用类型。
基本数据类型:直接存储数值。一般有:整型(byte / short / int / long)、浮点型(float / double)、布尔型(boolean)和字符型(char)。
自定义类型: struct,union,enum。
2.整数的基本概念
大家知道,整数包括负数,零,和正数。计算机中的整数分为有符号数和无符号数。
有符号数:最高位表示符号,即最高位为0,表示正数,最高位为1,表示负数。如果用N位来表示整数,那么有符号数的范围为:[-2^(N-1),(2 ^ (N-1) )-1]。用8位来表示有符号char整数数,由于第8位用于表示了符号,因此,有符号char 类型的表示范围为[-128,+127]。
无符号数:表示非负数,整个位数都用来表示整数的值。如果用N位来表示整数,无符号char的表示范围为[0,(2 ^ N)-1]。用8位来表示有符号整数数,则无符号char类型的表示范围为[0,255]。
原码,反码,补码
整数的编码分为原码、反码、和补码。计算里使用的是补码的存储方式。它们的定义如下:
正数 : 原码,反码,补码 都一样。
负数要另类讨论如下:
原码:在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。
反码:正数的反码与其原码相同。负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同,负数的补码就是对该负数的反码加1。
3.浮点数的存储
一般的编程语言都是将浮点类型的数据采用单精度类型( float)和双精度类型(double)来存储,float 数据占用 32bit,double 数据占用 64bit,我们在声明一个变量 float f= 2.25f; 的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范的, float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R64.53。无论是单精度还是双精度在存储中都分为三个部分:
浮点数表示的数值:V = (-1) ^ s × M × 2 ^ E
符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。
阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。float类型的阶码是 8 bits,double类型的阶码是 11 bits。
尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)
因为E在存储时是无符号数所以,在碰见负的次方时,通常计算机在存储时都加一个中间值 (float) : +127,(double) : +1023
再拿出的时候会在减去一个(float)-127 ,(double)-1023
那拿出的时候会碰见3种情况
不全为0或不全为1
跟上面说的是一样的
全为0
相当于一个接近于0的数,无穷小
获得真实值时会用1去减中间值,如(float)1 - 127
(double) 1 - 1023
全为1
会变一个无穷大的一个数