Java 基础 - 原生类型

更详细的说明,请参考: Java 原生类型与包装器类型深度剖析,https://blog.csdn.net/justloveyou_/article/details/52651211

回到顶部(go to top)

一. 原生类型与包装器类型

1Byte = 8 Bits

 

回到顶部(go to top)

二. 自动转型与强制转型

精度(低1-高5)    
1 byte(1字节) Byte
short(2字节) Short
char(2字节) Character
     
2 int(4字节) Integer
     
3 long(8字节) Long
     
4 float(4字节) Float
     
5 double(8字节) Double
     
NA boolean(未定) Boolean

1、 自动转型

自动转型总原则:byte,short,char(同级)-> int -> long -> float -> double (由低精度到高精度)

 

1.1 由低精度到高精度的自动转换

具体可分为以下两种情形:

 

 1)从位数低的类型向位数高的类型转换

复制代码
byte b = 1;
char c = 1;
short s = 1;
int i = 1;


c = b; // Error,同级
c = s; // Error,同级
s = c; // Error,同级
i = c; // OK
复制代码

 

 

2) 从整型向浮点型的转换

 

复制代码
int i = 1long t = 1;
float f = 1;
double d = 1;


f = i; // Ok
f = t; // Ok
d = f; // Ok
复制代码

 

1.2 运算符对基本类型的影响

具体可分为以下两种情形:

1) 当使用 +、-、*、/、%、==、>、< 等 等运算符对基本类型进行运算时,遵循如下规则:

  两个操作数中,先考虑是否有一个是double类型的。如果有,另一个操作数和结果 将会被转换成double类型。再依次考虑float,long。除此之外,两个操作数(包括byte、short、int、char)都将会被转换成int类型。

复制代码
byte b1 = 10 ;  //OK,会检查发现10没有超过byte类型的最大值
byte b2 = 12;   //OK,会检查发现12没有超过byte类型的最大值

byte b = b1 + b2; //Error,byte类型在计算时会自动提升为int类型,此时就会报错,因为b1+b2实际上是int类型,但是左侧的变量为byte类型。

short s1=1; //OK,会检查发现1没有超过short类型的最大值
s1=s1+1;    //Error,因为s1+1 结果int,但左侧变量为 short,报错

s1++;      //OK,不会报错,与s1=s1+1不同!!!,会检查发现2没有超过short类型的最大值

s1=1+1;   //OK,1+1 是个编译时可以确定的常量,'+'运算在编译时就被执行了,而不是在程序执行的时候,这个语句的效果等同于s1=2
复制代码

 

2) 当使用 +=、-=、*=、/=、%=  i++、 ++i 运算符对基本类型进行运算时,遵循如下规则:

  运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。自增(减)运算也类似。

short s1=1; // OK,会检查发现1没有超过short类型的最大值
short s2;

s1+=1;    // OK,正确,1首先被强制转换为short型,然后再参与运算,并且结果也是short类型

s2 = ++s1;     // OK,正确,s2的值为2

 

2、强制转型 

强制转换的格式是在需要转型的数据前加上 “( )”, 然后在括号内加入需要转化的数据类型。主要发生于以下两种情形:

  • 由高精度向低精度转换

  • 一种类型到另一种类型转换,则必须使用强制类型转化(同级之间:byte,short,char)

复制代码
 byte b = 3;
 int i = 3;
 long t = 3;
 float f = 3;
 char c = 3;
 short s = 3;

 i = (int) f;  // OK,由高精度向低精度转换
 t = (long) f;  // OK,由高精度向低精度转换
 b = (byte) i;  // OK,由高精度向低精度转换

 i = b; // OK,由低精度向高精度转换,自动转型
 System.out.println(c==s);  // OK,true,c 和 s 自动转型为int,然后比较

 b = (byte) s;  // OK,一种类型到另一种类型转换
 c = (char) b;  // OK,一种类型到另一种类型转换
 c = (char) s;   // OK,一种类型到另一种类型转换
复制代码

特别需要注意的是,强制转换常常会导致二进制位的截取,甚至会导致意想不到的结果:

int i = 128;
byte b = (byte)i;
System.out.println(b);           // -128(即-0)

 

 

 

---------------------
作者:书呆子Rico
来源:CSDN
原文:https://blog.csdn.net/justloveyou_/article/details/52651211
版权声明:本文为博主原创文章,转载请附上博文链接!

 

posted on   frank_cui  阅读(1715)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示