(Java核心技术基础知识(3) )----8种基本数据类型

3.3 数据类型

       Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。再java中,一共有8种基本类型,其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的bollean类型。

3.3.1 整型

整型用于表示没有小数部分的数值,它允许是负数。Java提供了四种整型。

          类型                                                  存储需求                                                          取值范围

           int                                                       4字节                                          -2 147 483 648 ~ 2 147 483 647

         short                                                     2字节                                                      -32 768 ~ 32 767

          long                                                     8字节                     -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807

          byte                                                     1字节                                                           -128 ~ 127

那int类型在计算机中是如何存储的呢?

首先先了解一下,计算机中的原码,补码和反码

原码:是用来表示数字的一种方式:一个正数,转换为二进制位就是这个正数的原码。负数的原码就是负数的绝对值转换成二进制             位然后在高位补1就是这个负数的原码

反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反

补码:正数的补码和原码相同,负数的补码位其原码除符号为所在位取取反(得到了反码了),然后最低为加1

           正数的反码和补码都与原码相同。

           负数的反码为对该数的原码除符号位外各位取反

           负数的补码为该数的原码除符号位外各位取反,然后最后一位加1

再说说为什么有了原码又出现了反码和补码

计算机和人脑不一样,能判断符号为来进行正负号的基本运算

比如 1 + -1 = [0000 0000]原+[1000 0001]原=[1000 0010]原=-2

答案当然是错误的

为了满足负数对加法的需求,就必须让负数与他对应的二进制码是同步递增或者递减的要求,由于正数本身满足它本身的加法,所以不需要任何改变。这就是反码的定义由来例如

-2+1=[1111_1101]反 + [0000_0001]反 = [1111_1110]反= -1

[1000_0000]的二进制没有对应任何真数,于是就规定了这个数的真数是-128

但是仍然存在问题:

-1 + 2 =[1111_1110]反 + [0000_0010]反 = [0000_0000]反=0

要解决这个问题就必须让反码中的[1111_1111]和[0000_0000]合并,

由于[1111_1111]+[0000_0001]=[0000_0000],所以负数反码的基础上+1就可以解决反码中跨0的误差问题,同时不会对负数与它对应的二进制反码的同步增加产生影响,所以再反码的基础上+1就完美的解决了符号参与运算的问题,这也就是为什么补码再负数反码的基础上+1的由来(而且cpu中只有加法电路)

实际上int类型在内存中是这样存储的低位在前,高位在后的方式存储的,也就是按照下面的方式

第1字节                 第2字节                  第3字节               第4字节
00000001             00000000               00000000           00000000

再说说int类型的取值范围是如何计算的

 范围 -2 147 483 648 ~ 2 147 483 647  怎么计算出来的呢

刚才说了,计算机中int类型是用补码储存的

原码为 0111 1111 1111 1111 1111 1111 1111 1111       (这是2^31-1)

           1000 0000 0000 0000 0000 0000 0000 0000    (这是2^31)

int类型是最常用的,但是如果表示星球上的居住人数,就需要使用long类型了。byte和short类型主要用于特定的应用场合。
长整型数值有一个后缀L或l(如40000000000L)。十六进制数值有一个前缀0x或0。八进制有一个前缀0(八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。)加上前缀0b或0B就可以写成二进制数。
3.3.2 浮点类型

浮点类型用于表示小数部分的数值。在Java种有两种浮点类型,具体内容

          类型                                                  存储需求                                                  取值范围

          float                                                    4 字节                           大约 ± 3.402 823 47E + 38 F(有效位数为 6 ~ 7 位)

         double                                                 8 字节                    大约 ± 1.797 693 134 862 315 70E + 308(有效位数为 15 位)

那float类型在计算机中是如何存储的呢?

S表示符号位,E为指数为,M表示尾数

根据IEEE float类型一共占4个字节共32位

 最高位符号通过0/1来区分S为0时为正数,S为1时为负数。

E指数为8位,对于8位补码-128~127,可得到对应的阶码表示为0~255,其中0和255分别用来表示0和无穷大,1~254用来表示规范数字,即指数范围从-126到127,也就是说实际的指数等于指数位表示的数值减127;

M在计算机内部保存时整数部分固定为1,M的范围是[1.0,2.0)之间默认这个数的第一位可以被舍弃,所以float尾数其实不是23位而是24位

M尾数为为23位则取二进制1.1......1(小数点23为),则取到2-2^-23 约等于2.

所以V的绝对值最大为2^127*(2-2^-23)约等于2^128=3.4E+38。加上符号之后可表示为(3.4E+38)。

实际上尾数决定了浮点数的精度,尾数只有23位,加上省略的那位就是24位。如果一个int类型的值小于224,那么float是完全可以表示的。如果int类型大于224就不一定能表示了。假如一个int数值的二进制表示形式是100000000000000000000000,表示成指数形式是1.00000000000000000000000*223,对应的float的类型,尾数位全部为0,指数位是23+127=150,这样完全没有问题。假如一个int数值的二进制表示形式是1000000000000000000000001,表示成指数形式是1.000000000000000000000001*224,对应的float的类型尾数位是000000000000000000000001一共24位,这样就完全超出了float最多容纳23位尾数的能力。所以就不能正确表达这个int值了。由此也可以得出不能被float准确表达的最小int值是224+1。我们再将1000000000000000000000001的值加1,变成了1000000000000000000000010,这样变换为指数形式可以看出尾数又变为了23位,也就是说25位的二进制整数最后一位是0才能被float准确表示,每2个数就有一个不能被准确表示。如果是26位的二进制整数最后两位都是0才可以被float准确表达,每4个数就有3个不能被准确表示,以此类推。

现在再来回答为什么在编程的过程中似乎没怎么引起注意,这是因为,我们平时用的数值基本都小于224+1=16777217。

double表示这种类型的数值精度是float类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。实际上,只有很少的情况适合使用float类型,例如,需要单精度数据的库,或者需要储存大量数据。float类型的数值有一个后缀F或f(例如,3.14F).没有后缀F的浮点数值(如3.14)默认为double类型。当然可以在浮点数值后面添加后缀D或d(例如,3.14D)。

3.3.3 char类型

3.3.5 boolean类型

boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。
 


 

猜你喜欢

转载自blog.csdn.net/wbs925zxh/article/details/87537962
今日推荐