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

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

1Byte = 8 Bits

二. 自动转型与强制转型

精度(低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 = 1;
long 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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List
  2. 3.js模式-策略模式
  3. 题目:在泛型为Integer的容器内添加一个字符串.
  4. iOS uiscrollView 嵌套 问题 的解决
  5. html5增强元素--续
  6. 将Oracle JDBC驱动库安装到本地仓库
  7. xcode6 iOS sdk8.1隐藏系统状态栏
  8. maven发布本地包,eclipse-maven集成tomcat7热部署项目
  9. CSS3秘笈复习:第七章
  10. Python 作用域, 局部与全局变量
  11. SQL SERVER 2012 AlwaysOn– 数据库层面 02
  12. TensorFlow 使用变量共享
  13. This 关键字的三个用处
  14. D. Little C Loves 3 II
  15. Day 03 基本数据类型
  16. 前端js数据排序
  17. WCF错误:413 Request Entity Too Large 的一个解决方法
  18. TOMCAT下面发布项目的4种方式
  19. python函数嵌套的实用技术
  20. 20162328蔡文琛 week09 大二

热门文章

  1. 第八篇 编写spider爬取jobbole的所有文章
  2. 我的vscode配置 利用Settings Sync一键安装
  3. C语言static和局部变量
  4. spring开发案例配合mysql
  5. 初识 flex 布局
  6. Oracle之数据类型问题
  7. PCA分析,及c++代码实现
  8. kubeadm部署一个Kubernetes集群
  9. Apache 环境变量配置
  10. Ruby 数据类型