8421码为什么有19(8421码为什么有非法码区)

3.5 数据类型

Java语言支持的数据类型分为两类:基本数据类型和引用类型

1、基本数据类型共8种,分为布尔类型(boolean)和数值类型,数值类型又分为整数类型和浮点类型。整数类型包括byte、short、int、long、char,浮点类型包括float(单精度浮点)和double(双精度浮点)。

2、引用类型包括类、接口和数组类型,还有一种特殊null类型。引用数据类型就是对一个对象的引用,对象包括实例和数组两种。空类型(null)就是null值类型,这种类型没有名称,所以不能声明一个null类型的变量或者转换到null类型。

数值分常量和变量。

常量:在程序运行中,不会改变的量。字符常量,字符串常量,整数常量,布尔值常量。

Java对整数常量提供了4种表现形式:二进制,八进制,十进制,十六进制。

进制概述:就是进位制,是人们规定的一种进位方法。 对于任何一种进制--X进制,就表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一,八进制是逢八进一,十进制是逢十进一,十六进制是逢十六进一。

计算机的电子原件的状态只有开,关两种。那么我们表达数据的时候,也是按照开,关的状态来表示的。如果我们表达数据仅仅用这两种状态,那么能够表达的数据是比较少的,为了能够表示更多的数据,国际化标准组织就规定,用8个这样的信号来表示一个数据,这个数据的单位叫:字节。

后来,我们就通过1,0分别表示开和关。由这样的1,0组成的数据就是二进制数据

但是,用二进制表达数据的表现形式有点长,怎么办?

把二进制的数据,从右开始,每三位一组合,最左边不足三位,用0补齐。然后分别计算出十进制,最后,再把每个十进制的数据组合起来,就是一个八进制的数据。

而把二进制的数据,从右开始,每四位一组合,最左边不足四位,用0补齐。然后分别计算出十进制,最后,再把每个十进制的数据组合起来,就是一个十六进制的数据。

那表示一个数值,用二进制需要8个,用八进制需要3个,用十六进制需要2个。进制越大,表示形式越短。

各进制之间的相互转换问题?

十进制转换至二进制,八进制,十六进制,以及相互转换。

引入:

123= 100+20+3=1*10^2+2*10^1+3*10^0=100+20+3=123

系数:每一个位上的数据值本身就是系数。

基数:X进制的基数就是x。

权:我们针对每一个位上的数据进行编号,从右边,并且是从0开始编号,这个编号就是该位上数据的权值。

计算:每一个位上的系数*基数^权次幂相加。

1.二进制,八进制,十六进制转换至十进制

二进制:0000 0100

100 = 1*2^2+0*2^1+0*2^0 = 4+0+0 = 4

八进制:基数是8。十六进制:基数是16。

2.十进制转换到二进制,八进制,十六进制。规则:除基取余,直到商为0,余数反转。

3.二进制与十进制之间快速转换的方法,8421码,是bcd码的一种,它表达的意思是每一个二进制位上的数据对应一个固定的值,只需要把对应的1位置的数据值相加,就会得到对应二进制的十进制值。

8421码:128,64,32,16,8,4,2,1。

4.任意x进制到y进制的转换,需要怎么做?

X进制 --- 十进制, 十进制 --- y进制

存储单位换算:1b= 8 bit1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB1EB=1024PB1ZB= 1024EB1YB= 1024ZB1BB= 1024YB1NB = 1024 BB1DB = 1024 NB3.5.1 原码、反码、补码

计算机中,有符号数据的表示法有三种:原码,反码,补码。所有的数字在计算机底层都是以二进制形式存在,但是计算机以补码的形式保存所有的整数。

定义32位的二进制整数时,最高位其实是符号位。符号位是1表示负数,0表示正数

举例:

int a = 0B10000000000000000000000000000011; //这是一个补码表示-2147483645

原码:直接将一个数值换算成二进制数。

反码:正数的反码与原码完全相同,负数的反码是对原码按位取反,只是最高符号位保持不变。

补码:正数的补码与原码完全相同,负数的补码是其反码加1。

举例:

1000 0000 0000 0000 0000 0000 0000 0011 为补码,要获得它的具体指需要先获取它的反码

负数的补码是其反码+1,那么其反码就是补码-1;

1000 0000 0000 0000 0000 0000 0000 0010 为反码,原码是对反码取反1111 1111 1111 1111 1111 1111 1111 1101 为原码,//-2147483645

做个-23的练习看一看~

3.5.2 整型

变量:随着程序的运行,数值发生变化的叫变量。定义一个变量需要知道变量类型,变量名称,还得有变量值,如果没有数值,定义这个东西就没啥作用了。

定义变量的格式 变量类型 变量名称 = 变量值 ;

1.byte:byte(1字节长度)类型的整数在内存里占8位,表示的范围是:-128(-2的7次方) ~ 127 (2的7次方-1)

字节:计算机的处理信息的最小单位。1字节=8位二进制数。

2.short:short(2个字节长度)类型整数在内存里占16位,表示范围-32768 ~ 32767

3.int:int(4个字节长度)类型在内存中32位,表示范围-2147483648 ~ 2147483647

4.long:long(8个字节长度)类型在内存中64位,表示范围-9223372036854775808 ~ 9223372036854775807


int类型是常用的整数类型,Java整数常量默认的就是int类型。byte,short定义时,他们接收的其实是一个int类型的值 。使用byte或者short类型时,整数的范围不能超过类型的范围,超出范围就会报错。例如:

byte a = 224; short b = 124455;

但是使用几个巨大的整数常量时,Java不会自动把整个整数常量当成long类型,所以需要在整数常量后面加上L作为后缀,例如:long a = 99999999999999999L;

Java中整数常量有4种表示方式:十进制,二进制(0b或者0B开头,0,1组成),八进制(以0开头,0-7组成),十六进制(以0x或者0X开头,0-9,a,b,c,d,e,f表示(大小写都可以))。

举例:int octalValue = 013; //八进制转换成十进制表示11int hexValue1 = 0X13; //十六进制转换成十进制表示19int hexValue2 = 0XAF; //十六进制转换成十进制表示175int binValue1 = 0B11011; //二进制转换成十进制表示27(JDK1.7中新增特性)3.5.3 字符型

字符型常用于表示单个字符,字符常量必须使用单引号括起来,例如:char a = ‘a’;char类型的值也可以直接作为整数类型的值来使用,是一个16位的无符号整数,范围是0 ~ 65535

表示方式如下:

Ø 直接通过单个字符来指定字符常量,例如’A’ ‘a’ ‘0’

Ø 通过转义字符表示特殊字符型常量,例如:’\n’ ‘\t’

Ø 直接使用Unicode值来表示字符常量,例如:’\uXXXX’,XXXX表示一个十六进制的整数。

举例:

char aChar = 'a';char enterChar = '\t';char ch = '\u667F';char name = '张';int value = name;System.out.println(aChar);System.out.println(enterChar);System.out.println(ch);System.out.println(value);

补充内容:
1、ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
2、UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
3、Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。
4、符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

3.5.4 浮点型

Java浮点类型:float和double。默认的是double类型。float占4个字节(byte)32位,double占8个字节(byte)64个长度。

float类型的常量后面必须以f或者F结尾,例如:float a = 12.55f; double类型的常量后面可以d或者D结尾,但是不强制追加,不写也没有问题。

特殊情况:正无穷大、负无穷大、非数分别用基本数据类型对应的封装类来表示。

浮点数的表示方式分为两种:

1、 十进制方式 float a = 12.55f;

2、 科学计数法形式: float a = 12.5e2f;

举例:

Float a = 12.555f;double b = 12.55;float a = 12.55e5f;float c = Float.NaN; //不是一个数float d = Float.NEGATIVE_INFINITY; //负无穷大int e = Integer.MIN_VALUE; //最小值3.5.5 布尔型

布尔型只有一个boolean类型,用于表示逻辑上的“真”或者“假”,数值只能是true或者false

举例:

boolean a = true; boolean b = false;

常用在逻辑判断上,例如:

if(a){System.out.println(“条件为真”);·}else{System.out.println(“条件为假”);}


变量使用注意事项:

1. 作用域:在哪一对大括号里定义,那个范围就是变量的作用域,同一个作用域内变量名不能重复。

2. 没有初始化值不能直接使用,使用前给值,不一定在定义时给值。但不建议后定义。

3. 一句话写一行。定义一个变量也是一句话,单独占据一行。

3.6 基本数据类型转换

Java程序中,不同的基本类型的值经常需要进行相互转换,Java提供了两种类型转换方式:自动类型转换和强制类型转换。

3.6.1自动类型转换(默认转换)

将一种基本数据类型的值直接赋给另一种基本数据类型,则这种方式被称为自动类型转换。前提是把一个范围小的数值或变量直接赋值给另一个数据范围大的变量时,系统可以进行自动类型转换。

举例:

byte a = 25;short b = a;long c = a;float d = a;System.out.println(d);

注意:不能将数据范围大的变量或数值赋值给范围小的变量,例如:int a = 25; byte b = a; 会直接报错。

自动转换顺序:byte->short->int->long->float->double

char->

这里byte,short,char他们参与运算时首先会自动转换成大范围类型再参加运算。有int类型就转换成int类型,有long类型的就转换成long类型再参加运算。

练习:

1.

byte i = 3;int j = 4;byte x = i+j; 这行有问题吗?int y = i+j; 这一行呢?

画图走起。 byte占8位,int占32位,画出二进制图看看。

2.

long:8个字节,float:4个字节 。那为什么float要比long的范围大呢?

1.它们底层的存储结构不同。2.float表示的数据范围比long的范围更大。

3.6.2强制类型转换

将大范围的数据向小范围的数据进行转换则需要进行强制转换

语法格式为:类型 变量名称 = (targetType)value;

例如:

float d = 12.5F;

int e = (int)d; //变量e的值为整数12,不会保留小数

别随意使用强制类型转换,因为强制类型转换隐藏着一个精度丢失的问题。

如果大范围的数据值超过了小数据的范围,则按位进行截取。


int a = 327775;short b = (short)a;System.out.println(b); //输出结果95int a1 = 336; // 0000 0000 0000 0000 0000 0001 0101 0000byte b1 = (byte)a1; //8位 截取后8位 0101 0000System.out.println(b1);3.6.1 测试题目

1. byte b1=3,b2=4,b; b=b1+b2; b=3+4;哪句是编译失败的呢?为什么呢?

b = b1 + b2;是有问题的。因为变量相加,会首先看类型问题,会做一个数值类型的提升,最终结果赋值也会考虑类型问题。而常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。byte类型数据是不能直接相加的,相加会自动类型会转换int型 。

变量在运行期间才会进行运算确定数值是不是超出了数值范围,而常量则在编译期间就已经做完了数值上的操作运算,这个活在javac命令运行的时候就已经搞定了。(感兴趣的同学下个反编译软件,把class文件扔进去就可以了)