数据类型及类型转换


 

计算机存储单元

最小的信息单元叫   位   (bit)  b
最小的存储单元叫 字节(byte)   B

  • 1B=8bit
  • 1KB=1024B
  • 1MB=1024KB
  • 1GB=1024MB
  • 1TB=1024GB
      

数据类型

在这里插入图片描述
  

Java中数据类型内存占用和取值范围

数据类型关键字内存占用取值范围
字节型byte1-128~127
短整型short2-32768~32767
整型int (默认)4-2的31次方 到 2的31次方-1
长整型long8-2的63次方 到 2的63次方-1
单精度浮点数float4         负数:-3.402823E+38 到 -1.401298E-45                 正数:1.401298E-45 到 3.402823E+38       
双精度浮点型double (默认)8         负数:-1.797693E+308 到 -4.900000E-324            正数:4.9000000E-324 到 1.797693E+308
字符型char20~65535
布尔型boolean1true ,false

注意

以下类型需要在后面加个标志

//long类型要在数字后面加个L
long num1=10L; 
//float类型要在数字后面加个F
float num2=11.13F;  
  • 如果不加会怎么样?
    • 不加L默认是int,int转为long是安全的;会自动转,能编译通过
    • 浮点数不加F默认是double类型,double转float可能会损失精度;不会自动转,编译通不过
    • 如果超过int的取值范围还不加L,也会报错了

整数拓展

进制 :二进制   十进制   八进制   十六进制
                0b                           0              0x

public class Demo {
    public static void main(String[] args) {
        int i1=10;
        int i2=010;
        int i3=0x10;
         //十进制
        System.out.println(i1);  
        //八进制0
        System.out.println(i2);  
        //十六进制0x
        System.out.println(i3);  
    }
}

输出结果:

10
8
16

浮点数拓展

public class Demo {
    public static void main(String[] args) {
       float f=0.1F;
       double d=1.0/10;
        System.out.println(f==d);
        System.out.println(f);
        System.out.println(d);
        
        float d1=23827835867f;
        float d2=d1+1;
        System.out.println(d1==d2);
    }
}

输出:

false
0.1
0.1
true
  • 解释
    最好完全避免使用浮点数进行比较

字符拓展

public class Demo {
    public static void main(String[] args) {
     char c1='a';
     char c2='中';
        System.out.println(c1);
         //强制转换
        System.out.println((int)c1); 
        
        System.out.println(c2);
         //强制转换
        System.out.println((int)c2); 
		
		char c3='\u0061';  //Unicode表 U0000-UFFFF(97-a  65-A)
	    System.out.println(c3);
    }
}
a
97
中
20013
a
  • 解释
    • 所有的字符本质上还是数字(强制转换可以把字符转成数字)
    • java 的 char 类型变量是用来储存 Unicode 编码字符的,Unicode 字符集包含了汉字,所以 char 类型自然就能存储汉字,但是在某些特殊情况下某个生僻汉字可能没有包含在 Unicode 编码字符集中,这种情况下 char 类型就不能存储该生僻字了
  • 转义字符
public class Hello {
    public static void main(String[] args) {
        // \t 制表符
        // \n 换行
        System.out.println("Hello\tWorld!");
    }
}

输出

Hello	World!

留个悬念

public class Demo {
    public static void main(String[] args) {
        String sa="Hello world";
        String sb="Hello world";
        System.out.println(sa==sb);

        String sc=new String("hello world");
        String sd=new String("hello world");
        System.out.println(sc==sd);
    }
    //对象 从内存分析
}

输出结果:

true
false

类型转换分类

1.自动类型转换(高-> 低)

把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。
例如:double d=10;

代码演示:

public static void main(String[] args) {
        int i = 128;
        double b = i;
        System.out.println(i);
        System.out.println(b);
    }

输出结果:

128
128.0

2.强制类型转换(低-> 高)

把一个数据范围大的数值或者变量赋值给另一个表示数据范围小的变量

  • 格式 目标值类型 变量名=(目标数据类型)值或者变量名
  • 例子 int k=(int) 8.88; // k=8;
  • 类型转换由低到高:
    表示数据范围从小到大图
    在这里插入图片描述
    代码演示:
public static void main(String[] args) {
        int i = 128;
        byte b = (byte)i;
        System.out.println(i);
        System.out.println(b);
    }

输出结果:

128
-128

解释:
byte的范围是-128~127,128显然溢出了

	byte a = 127; 
	a+=5; 
    System.out.println(a);   

输出结果: -124

解释:首先byte取值范围-128~127 当a+=1时此时已经是超过了byte的临界值此时输出的为-128 、a+=2时输出 为-127,以此类推a+=5时输出为-124


注意点

  1. 不能对布尔值进行转换
  2. 不能把对象类型转换为不相干的类型
  3. 在把高容量转换为低容量的时候,强制转换
  4. 转换的时候可能存在内存溢出,或者精度问题
   // 23
   System.out.println((int)23.7);      
   // -45
   System.out.println((int)-45.89f);   

常见问题

public class Hello {
    public static void main(String[] args) {

        //操作比较大的数,注意溢出问题
        //JDK7新特性,数字之间用下划线分割
        int money = 10_0000_0000;
        
        int year = 20;
        int total = money * year;
        //-1474836480
        System.out.println(total); 
         
        //money*year默认是int,转换之前已经出问题了
        long total2 = money * year; 
        //-1474836480
        System.out.println(total2); 

        long total3 = money * ((long) year);
        //20000000000
        System.out.println(total3);  
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值