运算细节
来源:互联网 发布:4g那家网络制式好 编辑:程序博客网 时间:2024/06/07 04:01
计算机中数字默认为int,一个int在java中占4个byte,一个byte ,8个bit,所以在java中一个整数占32个bit,即32个二进制数
接下来写几个容易出错的小片段:
byte b=3; byte b1=3; byte b2=7;
b=b1+b2; //这一行会编译错误,会丢失进度
b=3+7; //这就不会编译错误 System.out.println(b);
出现上述现象的原因是:java中所有整数默认都是int ,所以第一行 byte b=3;java底层就进行了强制类型转换,将int->byte,在转换之前,编译器会先判断3是否在-127-128区间范围内,如果在就能转换成功,否则会转换不成功,编译报错,b1,b2也是同理,
在 b=b1+b2;这里因为b1,b2是变量,变量可理解为变化的量,编译器无法判断大小,所以在这里,编译器要将b1+b2的值赋给b,
但是因为无法判断值得大小,所以无法完成赋值。
b=3+7;编译通过,因为3,7是常量,这里编译器完成运算,判断3+7在区间-127-128之间,所以完成赋值,
举个例:byte b=3;
byte b1=127;
byte b2=3;
b=b1+b2;
这里就超出byte的范围了,所以这就是损失精度的原因了。
int i=3; int x=3; int y=4; i=x+y; System.out.println(i);在java中所有整数都默认为了int类型,所有运算结果都默认为int ,所以在这里int 类型付给int类型无需判断了,直接赋值
但是在这里依然可能损失进度如下:
int i=3; int x=Integer.MAX_VALUE; int y=4; i=x+y; System.out.println(i); //运算结果是:-2147483645
为什么两个正数相加会得负数呢?因为int在java中占32位,x+y;超过int所能表示的最大范围,这里+4后,结果进一位得到33位数,但是在这里java中只能占32位,所以会舍弃1位,然后结果的值的二进制的第一位就为1;1在二进制中表示负数,所以在这里我们得到的结果是负数。
区别i++,++i
int a=1; int b=a++; System.out.println(a); //2 System.out.println(b); //1
int a=1; int b=++a; System.out.println(a); //2 System.out.println(b);//2这个我解释的不太清楚,不过很容易记忆a++先赋值再自增,++a先运算再自增。a++,在底层应该是先将a=1的值开辟一个临时空间存起来,然后完成自增动作,然后再将1的值赋给b,所以就是如上结果了,++a,++在前,先完成自增,所以就是2,2
short s=1; s+=3;
s=s+3;//会编译错误:丢失精度 System.out.println(s);这个跟byte相加的情况相识,s=s+3;因为s是变量,编译器无法判断数值大小,所以无法完成赋值动作,而s+=3;在底层已经完成了自动类型转换,已经检查过数值大小,所以在一定程度上s+=3,不等于s=s+3;
s+=3;相当于(short)(s+3);
阅读全文
0 0
- 运算细节
- byte类型运算细节
- js杂七杂八细节--运算符
- 运算关系里面的细节
- 看不到的Java细节:浮点运算
- C语言预处理#运算符的细节
- 一些Java运算符的细节
- php数据类型和运算符细节
- Java语言基础(类型运算细节)
- 类型运算问题(面试细节)
- php中字符串运算符细节问题
- Java中的<< >>运算符操作细节
- matlab 矩阵运算*的小细节
- 运算符重载里面程序运行细节
- 无符号 运算中的细节问题
- verilog位拼接运算符细节问题
- 《黑马程序员》java笔记->细节,关于三元运算符
- 关于取余运算的一些细节问题
- Spark开发-SparkSql的开发
- 实验二 线性表综合实验之顺序表
- 可滚动的 tbody
- MyBatis(二)第一个Mybatis项目
- git合并代码
- 运算细节
- Corn Fields POJ
- JSP页面详解
- 循环广告位组件(banner)的实现
- Java后台架构篇--Struts2.0体系结构图以及详解
- 【20170928】Java每日一练
- Mysql唯一索引 唯一约束
- [三分] [Scoi2010]传送带
- 计蒜客-跳跃游戏