Java基础之数据类型

数据类型

    java中有两种数据类型:基本数据类型和引用数据类型。我们用一张图简单概括下,有一个直观的印象:


下面会具体介绍八大数据类型。



整型(定点数):
byte:1个字节大小,占用内存8位,大小范围是-2^7~2^7-1;
short:2个字节大小,占用内存16位,大小范围是-2^15~2^15-1;
int:4个字节大小,占用内存32位,大小范围是-2^31~2^31-1;
long:8个字节大小,占用内存64位,大小范围是-2^63~2^63-1;


我们以byte为例,说明一下它的大小范围是怎么来的:
我们都知道数据在计算机中最钟都是以二进制的形式存储的,其中整数在计算机中是以补码的形式存在的,最高位为标志位,0代表正数,1代表负数。这里要补充几个概念的知识:
原码:数据直接转换成的二进制数据就是源码。
反码:除最高位(标志位)不变,其他位置取反。
补码:正数的补码和原码相同,负数的补码是反码+1;
了解了上面的三个概念以后,我们来看下byte的取值范围是怎么来计算的:

正数的补码和原码相同,去掉最高位,也就是说8位内存能存的最大数就是:


   也就是2^0+2^1+2^2+2^3+2^4+2^5+2^6=127=2^7-1

最小的负数也就是(负数的补码不能简单通过二进制来进行计算大小,是反着的):


因为负数的补码是反码+1得来的,我们反推,先-1,变成:


再取反变成:


也就是2^7,但是这个负数,所以其实是-2^7,也就是-128



所以byte的取值范围是-2^7~2^7-1.
其他类型同理,这里不做分析。



int是平时使用最多的整型,通常给出的整数也会默认是int类型,但是有以下两种情况需要注意:
1.如果把较小的整数(在byte或者short范围内)赋给一个byte或者short,系统会自动把这个数据当成byte或者short处理;
2.如果把一个超过int范围的数据赋给long,系统不会自动处理,需要自己在数据最后加上L,用来表明他的数据类型。


字符型:
字符型数据占两个字节的大小。
字符型数据用来表示单个的字符,使用单引号’’来表示。
字符型数据一般有三种表示形式:
(1)使用‘a’这种形式;
(2)使用转义字符‘\n’这种;
(3)使用Unicode字符集表示‘\uXXXX’,XXXX是一个十六进制的数;

附上常用转义字符:


    计算机存储char类似的数据时,实际上也是储存的编码值,也就是0~65335之间的一个整数值,所以char类型的数据可以参与整数类型之间的计算。


浮点型:
浮点型数据可以分为单精度float类型和双精度double类型数据。
float占4个字节,也就是32位;
double占8个字节,也就是64位。

但是浮点数区别于定点数,并不是除了标志位以后都可以填充数据,对于float来说,它虽然占用了32位,但是这32位是这样分配的:


    真正用来存储数据的只有最后的23位,换算成十进制以后有效数据只有6-7位,所以float可以保证的精度也就是6-7位,超过的话会丢失精度。

double:


    浮点型数据有两种表现方式:

(1) 十进制形式:0.12,.12,3.2,一定要有小数点,否则会被当成int处理;
(2)科学计数法:5.12e2,5.12E2.

浮点型数据默认类型是double类型,float类型的数据需要在后面加上f/F或者转换类型。

    在java中,我们用一个整数去除以0,java是会抛出异常的:


    但是在浮点数中,对于除以0.0定义了以下三种情况:

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
public static final double NaN = 0.0d / 0.0;
简单来说就是:
正数除以0.0会得到Infinity(无穷大);
负数除以0.0会得到- Infinity(负无穷大);
0.0除以0.0会得到NaN(非数);


*jdk7以后,java可以在数值中插入下划线用来区分位数,如int i = 8888_8888;


布尔型:
     boolean类型只能用true或者false来表示,当通过布尔型数据通过+运算符与其他数据进行运算时,会自动转换成字符串数据。


基本数据的类型转换
    在java中,数值类型的数据经常需要互相转换,转换分为自动转换和强制转换。


自动转换

当把一个范围较小的数值赋给另外一个数值范围较大的数据类型时,不需要自己进行转换,系统直接完成,就像好像将一个小瓶子中的水倒入大瓶子中一样,不会出现问题。用下面的图可以说明自动转换的情况:



强制转换
当把一个数值较大的数据赋给熟知范围较小的数据类型时,这个时候就需要进行强制转换,通过(typename)的形式强制转换类型,就好像大瓶子中的水倒到小瓶子,会有水洒出来(数据溢出),数据会有部分丢失,这种转换也叫做缩小转换(Narrow Conversion)。
我们看一小段测试代码:
package com.ljw.PrimiteAndRefrenceType;

/**
 * Created by liujiawei on 2018/7/14.
 */
public class Test {
    public static void main(String[] args) {
        int a = 128;
        byte b = (byte) a;
        System.out.println(b);
    }
}

我们将一个int类型的数据通过强制转换的形式赋给byte,猜一下输出结果会是什么?


    可以看到直接输出了-128,是不是不知道为什么输出的结果会是这样,我们来分析:

     int类型占内存的32位,所以128在内存中是这样表示的:

    而byte只占内存的8位,所以128赋给byte以后,byte变成了这样:


最高位是1,代表负数,上面说过计算机用补码的形式存在的,负数则是反码+1,所以我们先减1,得到:01111111,再取反得到10000000,也就是128,因为标志位为1,是负数,所以得到-128。





表达类类型的自动提升:
当一个算数表达式中包含多个数据类型的时候,整个表达式的数据类型会被自动提升,java有以下的规则:
(1)byte,short和char都会被自动提升为int类型;
(2)整个算数表达式的类型会自动提升到当前最高等级的类型;

*当有字符串参与表达式的时候,与字符串相连的会被转为字符串类型。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值