java中字节型数据范围是-128~127;为什么-128-1就会等于127;127+1又等于-128了呢?到底怎么算的啊?java字节
解决方案 »
- 菜鸟问题2-〉改变windows属性
- 网络编程方面的通信案例,请高手赐教?
- 数组超界如何解决
- 100求jxl.*包!!_______JAVA操作EXCEL文件
- String类和StringBuffer的区别?对"String不能变StringBuffer可以改变"理解不清楚
- 【转载】初学者怎样学习编程?
- 老看到有类上有注解 @SuppressWarnings("serial") 不写上就有黄色的提示 这个是干嘛呢 不写有事吗
- 如何改变一个JLabel指向的图片???
- 介绍一下一下这几款工具的区别
- 征求:applet连接数据库的方案
- 新手,请帮帮忙
- 这个代码,我要输入什么才可以获取到信息,求大神
比如
byte b = 127 + 1;//这样写报错:Type mismatch: cannot convert from int to byte
所以必须强制类型转换:
byte b = (byte) (127 + 1);因此就能理解为什么是-128了:
int型的127在计算机内的二进制是:
0000 0000 0000 0000 0000 0000 0111 1111
加1后变成:
0000 0000 0000 0000 0000 0000 1000 0000
即128
强制转换后截取低8位变成
1000 0000
这是byte类型-128的补码。
输入127,你可以看到数字下边的二进制
0111 1111
然后+1,你会看到二进制很正常的变成了
1000 0000,
但是显示的是-128因为最高位是符号位
最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出.
127+1 = -128;
127+2 = - 127;
127+3 = -126;-128 - 1 = 127;
不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
127:0111 1111
0 :0000 0001
相加:1000 0000
然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
这个问题五楼已经说得很清楚了至于为什么-128-1=127
原因:
-128:1000 0000
1:0000 0001
根据补码的计算:x+y=[x]+[y], x-y=[x]+[-y].x+y的变补
至于变补的概念,去查吧
所以:
-128+1的变补:
1000 0000
1111 1111
结果:
10111 1111
取前八个0111 1111=127
* @param args
*/
public static void main(String[] args) {
byte a=127;
byte b=1;
byte c = (byte)(b+a);//-128
//byte 类型 的 运算 要是没哟 float 和double 里面的运算都是 int 型 的运算 ,, 然后 再 强制类型转换成byte类型
System.out.println(c);
byte d=-1;
byte e= -128;
byte f= (byte)(d+e);//127
System.out.println(f);
}}
楼上说的很好 。。 就是这样的 要是没有 float 和 double 就 转换 为 int 运算 。。 算好之后 在强制类型转换 为 byte !!