java基本数据类型 byte、short、int、long、float、double、char的范围和运算中注意的事项(详细)

1.Java的8种基本数据类型及其所占空间大小:

boolean :

注意:

①为什么float占4个字节,而long占8个字节,float表示的范围却比long要大得多呢?

原因简单说是因为二者存储的模式不同,long类型是是直接用64位二进制位去存储数据的二进制原码,而float作为浮点数类型,在java里遵循IEEE754标准,将32位分为3个部分,第一部分1位存储符号,第二部分8位存储浮点数的科学表示后的指数,第三部分23,位存储浮点数的科学表示后的纯小数(有效数字部分),所以浮点数的范围要比其他任何数据类型都要大得多. 如果还有不明白详细请看

https://blog.csdn.net/i6223671/article/details/88312191

②boolean类型是否占一位?

我们通常默认为boolean值的长度为1/8字节也就是1位,因为1个二进制位就完全可以表示ture和false这两个值,但是在实际的内存中,boolean的站位的大小其实是和java的虚拟机有关.毕竟用java输出boolean类型的值是"true"或者"false"这样的字段,而不是0,或者1

③整数默认都是整型,小数默认都是double型, 所以表示long型常量时要在后

面加L(注意大写,小写容易和1混淆),float型后面需要加F,注意但是 byte/short类型没有这样的写法,因为byte,和short可以直接赋值范围类的整数

2.java基本数据类型的初始值

在这里插入图片描述

3.Java基本数据类型的范围排序

byte->short->int->long->float->double

4.基本类型的赋值与转换

boolean一般不参与其他类型的转换

原则:表示范围大的数据不能向表示范围小的数据赋值,即使被赋值的对象可以装得下这个,数据,但是系统任然会保存:可能存在精度损失
在这里插入图片描述
即由上面的那张图,数据类型只能顺着箭头赋值,不能逆着箭头赋值.

那么问题来了~
①.为什么char类型要单独拿出来?

char类型事实上是一个16位无符号整数,所以是不存在负数的,因此它是向下不兼容的,他的值是对应字符的编码;Java字符串类型采用Unicode字符集编码。Unicode是世界通用的长度字符集,所有的字符串都是16位.

②byte 和short类型赋值给char类型为什么会报错?

虽然说byte占一个字节,short和char占两个字节,但是char表示的范围是正数的一部分没有负数,所以和short,char类型之间有检查没有包含.

③既然整数默认都是整型的,那么为什么byte a = 127没有错误 ;

byte的取值范围: -128 ~ 127 ;我们一般向下转型的时候,会产生丢失进度的问题,但是,当我们使用明明确确的 **整形常量:** -128~127 ;将它们赋值给byte的时候,是不错产生这样的错误的,因为,它们的确是byte的取值范围 ;编译器,是认识常量值的,知道它们的值是 byte 的合法取值范围 ;因此,java允许这样的赋值(JVM对常量有优化机制) ,但是一旦超出范围就会报错**这也是为什么没有 123b,或者22s这样表示byte和short常数的写法.;**

④这个为什么会报错: byte a = 127 ; byte b = -128 ; byte c = a + b ;

因为 a 和 b 都是 变量。编译器虽然可以确定 a 和 b 两个变量的值,都是byte的取值范围,但是由于他们是变量,变量相加的值,**编译器在编译器期间是无从得知的**,而且,JVM中只有int,long,float,double四个数字类型支持,所以比int小的加运算自动转化成int的加运算,结果也是int因此,编译器会把byte和byte相加的值默认提升为int进行处理 ;

所以:java中byte,short,char在运算的时候都会提升为int,如果输出’a’+1的值为98

⑤为什么:bytea=10; a=a+10.会报错,而a+=10不会报错呢?

前者原因和第④条相同,而后者是因为 += 操作符,会默认帮我们进行强转 ;这也解释了 g += 10 ; 是正确的原因 ;底层有个自动强转在里面 ,所以a=a+10和a+=10是不一样的;

隐性转换

底范围和高范围的数据进行运算的时候,会将低范围值的向高范围值的类型转化,而没这种值的类型的变化并不会传递给变量.

例 :

byte a=10;
int b=a;

当编译intb=a 时, a隐式转换为int类型

又如,
int a=2;
double b=5.0;
则输出 b/a的值将为2.5,因为编译的时候,会将a提升为b的类型.

强制转换

特征:从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强制转换)注:一般情况下,不推荐使用强制类型转换,因为会损失精度.

格式:(转换后的数据类型)变量或者值。。

例1 :

int a=10;

byte b=(byte)a;

字符串的转换

原则:任何数据类型用’+'与字符串向连都会产生新的字符串.

如: System.out.println(“hello”+‘a’+1); -> helloa1
System.out.println(‘a’+1+“hello”); -> 98helloa
System.out.println(“6 + 6 =” 6 + 6 ); -> 6 + 6 =66(注意运算的顺序)

  • 27
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值