首先我们要知道,一个字节(byte)等于八位(bit)
现在我们常说的32位操作系统和64位操作系统,它们和基本数据类型没有很直接的关系,这些系统的本质其实依赖于cpu。cpu有32位和64位之分。32位的cpu一次性能处理4个字节的数据量也就是32位的数据量。以此类推64位的cpu能一次处理64位的数据量。操作系统是在此基础上开发的。
下面简单的列出了所有的基本数据类型
整数类型 字节 取值范围
byte 1 -128 -- 127
short 2 -32768(-2^15)~32767(2^15 - 1)
正负大约3万
int 4 -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 - 1);
正负大约21亿
long 8 -2^63 ~ 2^63 -1
浮点类型
float 4 -2^128 ~ +2^128
double 8 -2^1024 ~ +2^1024
字符类型
char 2 0 -- 65535
布尔类型
boolean true false
值得注意的是,short类型和char类型同样是2字节,但是取值范围不一样。char的最大值更大。
在Java中,char是16bit长的无符号整数,因此范围是:0~65535,而short则是16bit长的带符号整数,范围是-32768~32767。 short数据类型中有一个bit用来表示数据的正负。而char没有相应的bit用于表示正负,char默认为正整数。
所以,两者虽然字长相同,但意义却不一样(表示范围并不完全重合或包含),因此不管是char转换成short,还是short转换成char,都属于数值的“窄化转换”(Narrowing Primitive Conversion)。 窄化转化都可能“丢失精度”,因此必须强制转换。虽然,这里的“丢失精度”跟从int到short的丢失精度给人的感觉似乎不一样,但仔细想想也没有什么区别,一方面,char有16个bit表示数值,而short用于表示数值大小的只有15个bit,因此,从char到short会“丢失数值精度”,而另一方面,short有1个bit表示数值的符号,而char却根本没有这么个符号位(所有的bit都用来表示数值大小了),所以从short到char也可能“丢失精度”,只是这里丢失的是有关正负的“精确程度”。
另外 int 与float 同样都是4字节,long和double同样都是8字节。但是浮点类型范围远远大于整形。这是因为浮点数据并不能精确的表示一个数字,而是近似的表示一个数字。所以浮点型数据存在一个精度问题。
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:
1bit(符号位) 11bits(指数位) 52bits(尾数位)
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
总结:
对于我们来说,详细了解这方面的知识对以后的工作可能用处并不大,但是粗略的记住他们的取值范围还是能起到一些帮助的.