byte类型取值范围以及溢出详解

简介:

例1:

[html]  view plain  copy
 print ?
  1. public class test {  
  2.     public static void main(String[] args) {  
  3.         byte a = 127 ;  
  4.         a = (byte)(a+3) ;  
  5.         System.out.println(a);  
  6.     }  
  7. }  

输出-126,为什么呢
byte类型的取值范围是-128-127
这个输出结果是由java编码方式决定的,Java中正数用原码表示,负数用补码表示,第一位是符号位。
对于127他的编码是:
0000 0000 0000 0000 0000 0000 0111 1111
加上3也就是130,他的编码是:
0000 0000 0000 0000 0000 0000 1000 0010
使用强制转型后,a的编码就变成:
1000 0010
因为java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:
这样就变成 0111 1110
这样就是126加上符号,结果就是-126


例2:

[html]  view plain  copy
 print ?
  1. public class test {  
  2.     public static void main(String[] args) {  
  3.         short a = 128 ;  
  4.         byte b = (byte)a ;  
  5.         System.out.println(b);  
  6.     }  
  7. }  
输出-128,为什么呢


同上:

a的编码是:

0000 0000 1000 0000

强制转型后变为1000 0000

因为Java第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1:

还是1000 0000

这样就是128加上符号,结果就是-128


例3:

[html]  view plain  copy
 print ?
  1. public class test {  
  2.     public static void main(String[] args) {  
  3.         byte a = (byte)(-129) ;  
  4.         System.out.println(a);  
  5.     }  
  6. }  
输出127,为什么呢


同上:

a的补码是:

1000 0000 0000 0000 0000 0000 1000 0001

a的原码是:

0111 1111 1111 1111 1111 1111 0111 1111

强制转换,取后面8个字节,也就是

0111 1111

所以结果是127

目录
相关文章
|
存储
每日一道面试之byte类型127+1等于多少?
每日一道面试之byte类型127+1等于多少?
165 0
|
Dubbo 应用服务中间件
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
176 0
|
存储 Java
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
186 0
BYTE、WORD与DWORD类型
BYTE、WORD与DWORD类型
815 0
|
Java
Java中两个或多个byte数组合并及int类型转数组
Java中两个或多个byte数组合并及int类型转数组
425 0
|
Java 测试技术
为什么Java byte 类型的取值范围是-128~127
概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ,然 后 对 整个数 加 1 步骤: 1.确定byte是1个字节,也就是8位 2.最大的应该是0111 1111,因为第一位是符号位,0表示正数 3.
801 0
C# string类型和byte[]类型相互转换
string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); byte[]转成string: string str = System.
1575 0
|
C#
C# 读取 timestamp 时间戳 值为byte[] 类型时转换为时间戳字符串
C# 中如何读取出来的时间戳为 byte[] 类型的话,用以下方式转换成 16进制字符串 string tmpUfts = "0x"+ BitConverter.ToString(dataRow["MaxRowVersion"] as System.
1405 0