Java基础语法2 变量 数据类型 Byte类型范围 数据类型转换

Java基础语法2

java学习路线Day03

一、变量

变量概述:
在程序执行的过程中,在某个范围内其值可以发生改变的量
理解:如同数学中的未知数

Java中定义一个变量的语句定义格式:
数据类型 变量名=初始化值
注意:
1.格式是固定的,记住格式,以不变应万变
2.变量的值不能随便给,数据的类型我们要提前定义好
3.变量在被使用的时候必须要给一个值,初始化值
4.我们要给一个变量起一个名字

public class DataTypeDemo1 {
    public static void main(String[] args) {
        //Java中定义一个变量的语句定义格式:
        //数据类型 变量名=初始化值
        //定义一个Byte类型的变量
        byte b1=10;
        //定义一个short类型的变量
        short s1 = 100;
        //定义一个int类型的变量
        int i1 = 1000;
        //定义一个long类型的变量
        long l1 = 10000000000000L;
        System.out.println(l1);
        //定义一个float类型的变量
        float f1 = 12.34F;
        System.out.println(f1);//使用变量就是使用变量中存储的值
        //定义一个double类型的变量
        double d1 = 12.34;
        //定义一个char类型的变量
        char c1 = 'a';
        //定义一个boolean类型的变量
        boolean b2 =true;
注意事项:
1.如果要定义一个long类型的变量,在数值后面需要加上l或者L,表示是一个long类型的数据,推荐使用L, 因为Java中默认整数是int型
2.小数默认是double类型的,要定义float类型变量时,要加上f或F,表示是一个float类型
3.定义变量需要注意作用域,同一个作用域下,不能定义重名的变量
作用域:在Java中可以理解为同一个大括号 { } 内
4.一个变量如果没有初始化值,是不能使用的,只要在使用之前进行赋值即可,但是推荐在定义变量时就赋值
5.在方法上或内部定义的变量称之为局部变量。
6.在一行上建议只定义一个变量,可以定义多个,但是不建议

二、数据类型

java是一个强类型语言,对于每一种数据都定义了明确的具体数据类型。
因为不同的数据类型在内存中分配了不同大小的内存空间,所以每个大类型又分为很多小类型。分类如下:
image.png
各数据类型占字节数,以及表示范围如下:

image.png


数据类型范围问题

以Byte类型为例,Byte数据类型占一个字节,一个字节是8个bit位,最高位是符号位。所以在我们人脑的理解中范围应该是
1111 1111(-127) ~ 0111 1111(127)。
但是为什么Byte表示的范围是-128 ~ 127呢?
因为计算机中的所有数据运算都是以补码的形式完成。我们来把
1111 1111(-127) ~ 0111 1111(127)转换为补码应该是:

原码反码补码
1111 11111111 11101000 0001-1
0111 11110111 11110111 1111127

问题来了:
1000 0000(Byte类型的)代表的十进制值应该是多少呢?

System.out.println((byte)(0b10000000));

image.png
注意这里强制类型转换为了Byte型,如果是int型,10000000表示多少?

System.out.println((int)(0b10000000));

image.png
因为int型数据占4个字节,1000 0000只有一个字节,程序编译时,直接用0补全前三个字节,所以最高位也就是0,所以为正数。

        System.out.println((byte)(0b11111111));
        System.out.println((byte)(0b10000001));
        System.out.println((byte)(0b00000000));
        System.out.println((byte)(0b01111111));

image.png
从这里看出,Byte类型数据,从1111 1111~1000 0001表示 -1 到 -127,从
0000 0000~0111 1111表示0到127.而1000 0000表示-128.
所以Byte数据类型范围是 -128 ~127

三、数据类型转换

1.常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错
2.变量之间参与运算,要先提升数据类型,然后再运算

public class DataTypeDemo2 {
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
        System.out.println(a+b);
        int c = a+b;
        System.out.println(c);
        byte d=a+b;//报错
        byte e=3+4;
        System.out.println(e);
    }
}

image.png
a为int类型,b为int类型,a+b同样为int类型。而d是Byte类型,等于是用小盒子装大象,所以报错。
不想报错就需要强制类型转化

注意:e虽然是Byte类型,3,4默认应该是int类型,但是e=3+4却没有报错?
因为常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错。

数据类型之间有两种转换:
自动类型转换
指的是byte,short,char这些变量参与运算的时候,会先提升数据类型到int
(byte,short,char) —>int ---->long—>float—>double
byte,short,char相互之间不转换,他们参与运算首先转换为int类型

强制类型转换
用小的数据类型变量接收大的数据类型变量的时候会报错,这时候使用强制类型转换

	语句定义格式:
    	目标数据类型 变量名 = (目标数据类型)(要转型的变量值或表达式)

注意:由于是强制类型转换,底层有截取的过程,可能会造成最终结果有精度损失
例如把上面的d强制类型转换:

        byte d=(byte)(a+b);//类型转换
        System.out.println(d);

image.png


题目:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
image.png
1.虽然b1和b2定义时是Byte类型,但是参与运算时自动转换为int类型,而变量b是Byte类型,属于是小盒子装大象。所以编译失败。
2.虽然在Java中,整数默认是int类型,但是常量之间参与运算,会先进行数值相加,然后拿着结果去看一看在不在目标数据类型的范围内,如果在,就直接赋值,不在则报错。所以b=3+4;这一个语句没有报错。(那如果换成小数常量相加呢?自己试一试)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值