JavaSE学习(一)进制运算、数据类型、变量

作者 Zhendong Ho 日期 2019-01-10
JavaSE学习(一)进制运算、数据类型、变量

常量的概述和使用

什么是常量

在程序执行的过程中其值不可以发生改变。

Java中常量的分类

  • 字面值常量
  • 自定义常量

字面值常量的分类

class Demo1_Constant {
public static void main(String[] args) {
/*
* 字符串常量 用双引号括起来的内容
* 整数常量 所有整数
* 小数常量 所有小数
* 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个字符
* 布尔类型 只有true和false
* 空常量 null
*/
System.out.println("abc"); //字符串常量
System.out.println(123); //整数常量
System.out.println(' '); //代表空格字符
System.out.println(true); //布尔常量
}
}

进制运算

不同进制数据的表现形式

二进制:由0,1组成。以0b(b可以大写也可以小写)开头。(JDK1.7版本以后可以表示二进制)

八进制:由0,1-7组成。以0开头

十进制:由0,1-9组成。整数默认是十进制的。

十六进制:由0,1-9,a,b,c,d,e,f(大小写均可)组成。以0x开头

class Demo1_Scale {
public static void main(String[] args) {
System.out.println(0b100); //4,二进制表示形式前面加0b(b可以大写也可以小写)
System.out.println(0100); //64,八进制表示形式前面加0
System.out.println(100); //100,十进制
System.out.println(0x100); //265,十六进制表示形式前面加0x(可以大写也可以小写)
}
}

任意进制到十进制的转换

系数 * 基数的权次幂相加即可

任意(十)进制12345转换为十进制:

12345 = 10000 + 2000 + 300 + 40 + 5

= 1 * 10 ^ 4 + 2 * 10 ^ 3 + 3 * 10 ^ 2 + 4 * 10 ^ 1 + 5 * 10 ^ 0 = 12345

系数:就是每一位上的数据。

基数:X进制,基数就是X。

:在右边,从0开始编号,对应位上的编号即为该位的权。

十进制到任意进制的转换

除积倒取余数

十进制12345转换为任意(十)进制:

12345 ÷ 10 = 1234 ...... 5

1234 ÷ 10 = 123 ...... 4

123 ÷ 10 = 12 ...... 3

12 ÷ 10 = 1 ...... 2

1 ÷ 10 = 1 ......1

快速的进制转换法

8421码

8421码是中国大陆的叫法,8421码是BCD代码中最常用的一种。

在这种编码方式中,每一位二进制代码的1都是代表一个固定数值,把每一位的1代表的十进制数加起来,得到的结果就是它所代表的十进制数码。

通过8421码的方式进行二进制到十进制的转换

二进制11001100转换为十进制:

1		1		1		1		1		1		1		1

128 64 32 16 8 4 2 1

0b11001100 = 4 + 8 + 64 + 128 = 204

二进制到八进制的简易方式

二进制111100转换为八进制:

111		100

7 4

0b111100 = 074

二进制到十六进制的简易方式

二进制111100转换为十六进制:

11		1100

3 C

0b111100 = 0x3C

任意进制到二进制的简易方式

十进制60快速转换法转换为二进制:

1		1		1		1		1		1		1		1

128 64 32 16 8 4 2 1

60 - 128 < 0 ...... 0

60 - 64 < 0 ...... 0

60 - 32 = 28 > 0 ...... 1

28 - 16 = 12 > 0 ...... 1

12 - 8 = 4 > 0 ...... 1

4 - 4 = 0 ...... 1

后面两位依次为0, 0。

60 = 0b00111100

原码反码补码

原码:二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

注意

  • 运算通常以补码的形式进行计算,如+7加-7。
  • 反码的作用是,通过反码求出补码。

数据类型的分类和概述

Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。

Java中数据类型的分类

  1. 基本数据类型
  2. 引用数据类型

基本数据类型分类(4类8种)

整数型

数据类型 占用空间 取值范围
byte 一个字节 -128到127
short 两个字节 -2^15到2^15-1
int 四个字节 -2^31到2^31-1
long 八个字节 -2^63到2^63-1

浮点型

数据类型 占用空间 取值范围
float 四个字节 -3.403E38到3.408E38
double 八个字节 -1.798E308到1.798E308

字符型

数据类型 占用空间 取值范围
char 两个字节 0到65535

布尔型

数据类型 占用空间 取值范围
boolean Java中没有明确指定大小

定义不同数据类型的变量

class Demo1_DataType {
public static void main(String[] args) {
//整数类型
byte b = 10; //占一个字节,-128-127
short s = 20; //占两个字节
int i = 30; //占四个字节
long x = 88888888L; //占八个字节,整数默认是int类型,88888888超出int范围,必须加L标识

//浮点类型
float f = 12.3F; //占四个字节,小数默认是double类型,后面必须加F标识
double d = 33.4; //占八个字节,double类型后面也可以用D或d标识,但是一般不加

//字符类型
char c = 'a'; //占两个字节

//布尔类型
boolean b1 = true;
boolean b2 = false;
}
}

注意

  • 整数默认的数据类型是int类型。
  • 如果long类型后面加L进行标识,最好加大L。
  • 小数默认的数据类型是double类型。

数据类型转换

隐式转换

int x = 3;
byte b = 4;
x = x + b; //先把b提升为int类型,与x相加后赋值给x,结果为int类型

强制转换

int x = 3;
byte b = 4;
b = (byte)(x + b); //先把b提升为int类型,与x相加后结果赋值给b(int类型赋值给byte,强制转换砍掉int前面24位)

强制转换超出范围

byte b = (byte)(126 + 4);	//超出范围,强制转换得到的可能不是想要的结果
byte b2 = (byte)(300); //int强制转换为byte,砍掉int前面24位,剩下8位的结果

变量相加和常量相加的区别

//面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;//精度损失报错
/*
1.byte与byte(或short、char)进行运算的时候会提升为int,两个int类型相加的结果也是int(b3需要强制转换)
2.b1和b2是两个变量,在编译的时候无法判断具体的值,相加有可能超出byte的取值范围
*/
byte b4 = 3 + 4;//不会报错,java编译器有常量优化机制,3和4都是常量,结果为7没有超出byte取值范围

long与float的取值范围

进行混合运算的时候,byte、short、char不会相互转换,都会自动提升为int类型。其他类型进行混合运算,都是小的数据类型提升为大的。byte、short、char -> int -> long -> float -> double。

float f = 12.3f;
long x = 12345;

f = x; //隐式转换,说明f取值范围比x大

x = f; //强制转换

/*
float占4个字节
IEEE 754
32个二进制位
1位代表是符号位
23位代表尾数位
8位代表指数位
00000000 - 11111111
0 - 255(0代表0,255代表无穷大)
1 - 254(去掉0和255)
-126 - 127(减去127)
float的取值返回是-126-127,超过long的取值范围,float的取值范围比long取值范围大
*/

算数运算符

%运算符

  • 当左边的绝对值小于右边绝对值时,结果是左边。
  • 当左边的绝对值等于右边或是右边的倍数时,结果是0。
  • 当左边的绝对值大于右边绝对值时,结果是余数。
  • %运算符结果的符号只和左边有关系,与右边无关。
  • 任何一个正整数%2结果不是0就是1,可以用来当作切换条件。

++和--

b++相当于b = b + 1,为什么b++不会报错而b = b + 1会报错呢?

byte b = 10;
b++; //b = (byte)(b + 1)
//b = b + 1; //报错,当byte与int进行混合运算的时候,会提升为int类型,两个int相加的结果还是int,赋值给byte会损失精度
System.out.println("b = " + b);

原因:++是运算符,需要返回一个结果。所以b++的底层操作会加一个强制转换,即b = (byte)(b + 1)。

赋值运算符

short s = 1;
//s = s + 1; //报错,当short与int进行运算时,会提升为int类型,两个int类型相加结果还是int
s += 1; //s = (short)(s + 1),与++和--原理一样