18 个解决方案
#1
字节长度是8位,最左位是符号位
127的二进制: 0111 1111
-1的二进制: 1111 1111,加一为全0,
-2的二进制: 1111 1110
……
-128的二进制: 1000 0000
因而 127+1=-128
127的二进制: 0111 1111
-1的二进制: 1111 1111,加一为全0,
-2的二进制: 1111 1110
……
-128的二进制: 1000 0000
因而 127+1=-128
#2
溢出!最大的int + 1 = 最小的int
#3
这是二进制相加减的溢出问题
#4
支持
#5
java中byte类型作计算,都会先转换成int类型再计算。
比如
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的补码。
比如
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的补码。
#6
楼上讲的到是挺详细的,byte字节占8位,127+1就溢出了,计算机进行运算时,以补码形式进行运行,最前面一位是符号位,所以就变成-128了
#7
+1
#8
希望你用的是win7,打开附件里面的计算器。查看>程序员
下面数字键左边选择,十进制和字节
输入127,你可以看到数字下边的二进制
0111 1111
然后+1,你会看到二进制很正常的变成了
1000 0000,
但是显示的是-128
因为最高位是符号位
下面数字键左边选择,十进制和字节
输入127,你可以看到数字下边的二进制
0111 1111
然后+1,你会看到二进制很正常的变成了
1000 0000,
但是显示的是-128
因为最高位是符号位
#9
数据溢出,byte 一个字节8为只能保存,256个数字,byte 从 -128到 +127,
最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出.
127+1 = -128;
127+2 = - 127;
127+3 = -126;
-128 - 1 = 127;
不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出.
127+1 = -128;
127+2 = - 127;
127+3 = -126;
-128 - 1 = 127;
不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
#10
首先你肯定声明的是byte类型的,然后字节长度是8位,最左位是符号位,0为正数,1为负数
127:0111 1111
0 :0000 0001
相加:1000 0000
然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
127:0111 1111
0 :0000 0001
相加:1000 0000
然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
#11
上面的你们说的都是原码在加减,计算机中的计算是原码间的进行还是补码之间进行运算啊??谢谢啦
#12
计算机组成原理没有学好
#13
计算机里是补码
你仔细理解,按原码计算和按补码计算都是一样的,因为最后存储在计算机里的都是补码。
#14
127的二进制: 0111 1111
-128的二进制:1000 0000
-128的二进制:1000 0000
#15
127+1=-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
这个问题五楼已经说得很清楚了
至于为什么-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
#16
溢出问题!楼上说的很清楚了!
#17
public class Demobyte {
/**
* @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 !!
/**
* @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 !!
#18
哥们,那能帮忙解释一下-127-128吗?为什么结果会是1
-127: 1111 1111
+
-128: 1000 0000
如果如果截断的话,是不是
= 127 0111 1111
但是结果是1呢。
如果我这么理解
-128 1000 0000 减127
-
127 0111 1111
= 1 0000 0001
这样的话就是1了,麻烦解释一下吧
#1
字节长度是8位,最左位是符号位
127的二进制: 0111 1111
-1的二进制: 1111 1111,加一为全0,
-2的二进制: 1111 1110
……
-128的二进制: 1000 0000
因而 127+1=-128
127的二进制: 0111 1111
-1的二进制: 1111 1111,加一为全0,
-2的二进制: 1111 1110
……
-128的二进制: 1000 0000
因而 127+1=-128
#2
溢出!最大的int + 1 = 最小的int
#3
这是二进制相加减的溢出问题
#4
支持
#5
java中byte类型作计算,都会先转换成int类型再计算。
比如
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的补码。
比如
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的补码。
#6
楼上讲的到是挺详细的,byte字节占8位,127+1就溢出了,计算机进行运算时,以补码形式进行运行,最前面一位是符号位,所以就变成-128了
#7
+1
#8
希望你用的是win7,打开附件里面的计算器。查看>程序员
下面数字键左边选择,十进制和字节
输入127,你可以看到数字下边的二进制
0111 1111
然后+1,你会看到二进制很正常的变成了
1000 0000,
但是显示的是-128
因为最高位是符号位
下面数字键左边选择,十进制和字节
输入127,你可以看到数字下边的二进制
0111 1111
然后+1,你会看到二进制很正常的变成了
1000 0000,
但是显示的是-128
因为最高位是符号位
#9
数据溢出,byte 一个字节8为只能保存,256个数字,byte 从 -128到 +127,
最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出.
127+1 = -128;
127+2 = - 127;
127+3 = -126;
-128 - 1 = 127;
不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
最大的再加 >1的数就会数据溢出,最小的再减 >1的也会溢出.
127+1 = -128;
127+2 = - 127;
127+3 = -126;
-128 - 1 = 127;
不光是byte类型,short、int、long、float、double 都会数据溢出。其实5楼分析的很充分了。
#10
首先你肯定声明的是byte类型的,然后字节长度是8位,最左位是符号位,0为正数,1为负数
127:0111 1111
0 :0000 0001
相加:1000 0000
然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
127:0111 1111
0 :0000 0001
相加:1000 0000
然后要明白第一位是1为负数,他的绝对值=补码+1,也就是0111 1111+0000 0001为128,所以最后结果是-128
#11
上面的你们说的都是原码在加减,计算机中的计算是原码间的进行还是补码之间进行运算啊??谢谢啦
#12
计算机组成原理没有学好
#13
计算机里是补码
你仔细理解,按原码计算和按补码计算都是一样的,因为最后存储在计算机里的都是补码。
#14
127的二进制: 0111 1111
-128的二进制:1000 0000
-128的二进制:1000 0000
#15
127+1=-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
这个问题五楼已经说得很清楚了
至于为什么-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
#16
溢出问题!楼上说的很清楚了!
#17
public class Demobyte {
/**
* @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 !!
/**
* @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 !!
#18
哥们,那能帮忙解释一下-127-128吗?为什么结果会是1
-127: 1111 1111
+
-128: 1000 0000
如果如果截断的话,是不是
= 127 0111 1111
但是结果是1呢。
如果我这么理解
-128 1000 0000 减127
-
127 0111 1111
= 1 0000 0001
这样的话就是1了,麻烦解释一下吧