Byte的数值范围为何是-128到127

Byte的数值范围为何是-128到127

一、原码、反码和补码

在探讨Byte的数值范围为何是-128到127这个问题前,首先要了解原码、反码和补码的概念。对于一个数字,计算机要使用一定的编码方式进行存储。原码、反码和补码是计算机存储一个具体数字的编码方式,并且最高位(第一位)存放符号,正数为0,负数为1。

1.原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。这里真值表示最高位不存放符号且参与到计算中。

[+1] (原) = [0000 0001]

[-1 ] (原) = [1000 0001]

因为第一位是符号位,所以8位二进制数的取值范围就是:

[1111 1111, 0111 1111] 即[-127, 127]

原码是人脑最容易理解的和计算的表达方式。

2.反码

反码的表示方式是:

正数的反码是其本身

负数的反码是在其原码的基础上,符号位不变,其他依次取反

[+1] = [0000 0001] (原) = [0000 0001] (反)

[-1 ] = [1000 0001] (原) = [1111 1110] (反)

3.补码

补码的表示方式是:

正数的补码就是原码本身

负数的补码就是其反码加1

[+1] = [0000 0001] (原) = [0000 0001] (反) = [0000 0001] (补)

[-1 ] = [1000 0001] (原) = [1111 1110] (反) = [1111 1111] (补)

二、为何要使用原码、反码和补码

首先,让计算机辨别“符号位“会使计算机的基础电路设计更加复杂,于是人们就想出让符号位参与到计算的方法。我们知道,根据运算法则,减去一个正数等于加上这个数的负数,即1 - 1 = 1+ (-1) = 0。所以机器没有减法,只有加法,这样计算机运算就更加简单了。

原码

计算十进制的表达式:1 - 1 = 0

1 - 1 = 1 + (-1) = [0000 0001] (原) + [1000 0001] (原) = [1000 0010] (原) = -2

显然这个结果是错误的。为了解决这个问题,于是就出现了反码。

补码

计算十进制的表达式:1 - 1 = 0

1 - 1 = 1 + (-1)

= [0000 0001] (原) + [1000 0001] (原)

= [0000 0001] (反) + [1111 1110] (反)

= [1111 1111] (反)

= [1000 0000] (原) = - 0

发现用反码的计算减法,结果的真值绝大部分是正确的,而唯一的问题是出现在“0”这个特殊的数值上。虽然人们理解+0和-0是一样的,但是0带上符号是没有任何意义的。而且会有[0000 0000] (原) 和[1000 0000] (原) 两个编码表示0。于是补码的出现,就解决了这个问题。

补码

计算十进制的表达式:1 - 1 = 0

1 - 1 = 1 + (-1)

= [0000 0001] (原) + [1000 0001] (原)

= [0000 0001] (补) + [1111 1111] (补)

= [1 0000 0000] (原)

= [0000 0000] (原)= 0

由于Byte只能存储8位,这里 [1 0000 0000] (原) 最高位的”1“溢出,取尾8位,即[0000 0000] (原)。这样0用[0000 0000] 表示,而且可以用[1000 0000] 表示-128。

计算十进制的表达式 :- 1 - 127 = -128

-1 - 127 = (-1) + (-127)

= [1000 0001] (原) + [1111 1111] (原)

= [1111 1111] (补) + [1000 0001] (补)

= [1 1000 0000] (补) = -128

同理最高位的”1“溢出,取尾8位,即[1000 0000] (补)。[1000 0000] 为什么用“(补)”而不是“(原)”呢?因为实际上是使用-0的补码来表示-128的。并且对-128的补码[1000 0000] (补)计算出来的原码是[0000 0000] (原) = 0,这是不正确的。使用补码,不仅修复了0的符号以及存在两个编码的问题,并且还能表示一个最小数,这既是Byte的数值范围是[-128, 127]的原因。

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注释   • 单行注释 用双斜线 ”//” 表示   • 多行注释 用 /*------------------*/ 表示   • 文档注释 用 /**-----------------*/ 表示 文档注释与javadoc   •文档注释还可以通过javadoc 命令来生成API文档   •格式: javadoc –d apidoc 源文件名     –其中-d path指定存放API文档的路径。   •API 文档包括三个区域分别是:包区域,类区域,详细说明区域 注: 如果要出现包区域,要让不同类处于不同的包下面才会出现包区域。 标识符和关键字   •分隔符:常见的分隔符有分号; 花括号{} 方括号[ ] 圆括号() 空格 圆点 .     –在 Java 语言中每一条语句的结束用分号表示;   •标识符的规则:由字母,数字,下划线_,美元$组成,但数字不能开头.   •标识符不能是java的关键字和保留字,但中间可以包含标识符,不能包含空格。   •Java 的关键字加上goto const true false null 一共有53个关键字和保留字,都不能作为Java的标识符。 标识符举例 –abc_xyz √ –HelloWorld √ –abc$ √ –$中文 √ –_abc 对 √ –xyz#abc × –abc1 √ –1abc × 数据类型的分类   •Java语言是一个强类型语言。     –所有变量,必须先声明类型,再使用。     –指定类型的变量,只能装对应的类型的数据。什么样的瓶子装什么样的酒。   •Java 语言支持的类型分为两大类: 基本数据类型和引用类型     –基本数据类型包括八大数据类型。     –引用类型包括数组、类、接口。 变量   •变量就是用来记录数据的。   •计算机内存里数据就需要通过变量来访问它。   •通俗一点,你可以把变量理解成容器,它可以装数据。 使用Scanner获取键盘输入   •使用Scanner类可以很方面地获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文 件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可接受文件、输 入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。   •Scanner主要提供了两个方法来扫描输入:     –hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果 需要判断是否包含下一个字符串,则可以省略Xxx。     –nextXxx():获取下一个输入项。Xxx的含义与前一个方法中Xxx相同。 基本数据类型   •Java 的基本数据类型可以分为两大类: boolean 类型 和 数值类型.   •而数值类型又可以分为整型和浮点型     –整型包括:byte short int long(广义的整型包括char型)     –在内存中各占:1,2,4,8个字节, 各有各的取值范围,略记一下。   •在定义long 类型时 必须在数字后面加L,   •整数常量有三种表示方式: 十进制,八进制(以0开头),十六进制(以0x开头), 二进制(以OB开头—jdk1.7)   •在java 语言中,运算过程中,整型类型默认为 int 类型   •什么样的类型的变量 只能存放什么样类型的值 浮点型   •浮点型 包括 : float 和 double 型 两种。他们分别占有4个字节和8个字节,但他们远远比int 和 long 的 4 和 8 个字节大的多   •Java 语言的浮点数有两种表示方式:十进制数形式,浮点数必须包含小数,否则系统将认为是一个int 型 如: 8.0 不能省略为: 8   •科学计数法形式:     –注: 只有浮点数才有科学计数法,,   •Java 语言的浮点数默认是double 型,,如果要表示float 型 必须在数字后面加 f(如:1.3f),   •Java 的三个特殊的浮点数值:正无穷大,负无穷大和非数   •所有的正无穷大都是相等,负无穷大都是相等,,而非数不与任何数值相等,与自己也不相等,只有浮点数除0 才可以 得到这三个数,整数除0将报错;
Java的 的8⼤基本数据类型 ⼤基本数据类型 Java8⼤基本数据类型 ⼤基本数据类型   byte(字节型)、short(短整型)、int (整型) 、long(长整型)   float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、char(字符型) 整型   byte数据类型是8位, 1个字节,默认值:0,取值范围:(-128 - 127);   short数据类型是16位,两个字节,默认值:0,取值范围:(-2^15 - 2^15 -1);   int 数据类型是32位,4个字节,默认值:0,取值范围:(-2^31 - 2^31 -1)   long数据类型是64位,⼋个字节,默认值:0L,整型常量若要声明为long类型,需要在数字后加上l或L,long a = 10000L; 浮点型   float数据类型是单精度、32位浮点数;默认值:0.0f,若要定义float类型的变量需要在⼩数后⾯追加f或者F,float a= 2.3f;   double数据类型是双精度、64位、符合IEEE 754标准的浮点数;默认值:0.0d,double d = 2.3;   描述整数默认⽤int,描述⼩数默认⽤double。long⼀般⽤于描述⽇期、时间、内存、⽂件⼤⼩,IO处理⼀般使⽤byte 字符型   char⼀般⽤于描述中⽂(基本忽略),取值范围:(\u0000 - \uffff) —>(0 - 65535);,字符型⽤' '表⽰;char ch = 'A',   char和int可以相互转换,char转int直接赋值,int 转char强转。 布尔型   boolean表⽰⼀位的信息,只有两个取值:true和false,默认值:false 每个数据类型对应的包装类中都有对应的SIZE属性返回位数,MIN_VALUE和MAX_VALUE返回该数据类型最⼩值和最⼤值。 public class PrimitiveTypeTest{ public static void main(String[] args){ //byte System.out.println("基本类型:byte ⼆进制位数:" + Byte.SIZE); System.out.println("包装类:java.lang.Byte"); System.out.println("最⼩值:Byte.MIN_VALUE = " + Byte.MIN_VALUE); System.out.println("最⼤值: Byte.MAX_VALUE = " + Byte.MAX_VALUE); // char System.out.println("基本类型:char ⼆进制位数:" + Character.SIZE); System.out.println("包装类:java.lang.Character"); // 以数值形式⽽不是字符形式将Character.MIN_VALUE输出到控制台 System.out.println("最⼩值:Character.MIN_VALUE=" +(int)Character.MIN_VALUE); // 以数值形式⽽不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println("最⼤值:Character.MAX_VALUE="+(int) Character.MAX_VALUE); } } 运⾏结果: 基本类型:byte ⼆进制位数:8 包装类:java.lang.Byte 最⼩值:Byte.MIN_VALUE = -128 最⼤值: Byte.MAX_VALUE = 127 基本类型:char ⼆进制位数:16 包装类:java.lang.Character 最⼩值:Character.MIN_VALUE=0 最⼤值:Character.MAX_VALUE=65535 Float和Double的最⼩值和最⼤值都是以科学计数法的形式输出的,结尾的"E + 数字"表⽰E之前的数字要乘以10的多少次⽅。 eg:1.4E-45 —> 1.4 10^(-45) 数据类型转换必须满⾜如下规则: 数据类型转换必须满⾜如下规则:   1.不能对boolean类型进⾏类型转换   2.不能把对象类型转换成不相关类的对象   3.⼩的数据类型与⼤的数据类型做数值运算时,⼩的数据类型会⾃动提升为⼤的数据类型。   4.⼤的数据类型要转为⼩的数据类型必须强转,强转可能会丢失数据。   5.浮点数到整数的转换是通过舍弃⼩数得到,⽽不是四舍五⼊   低级--------> ⾼级   byte,short,char->int->long->float->double 举例说明: p

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值