Java 语言基础 Day02
2012/2/27
====================
变量,
Java的变量存储(二进制)
Java的变量类型
数据类型转换
1. Java 变量
1) 变量就是自然语言中的代词
Person he; int age = 15;
//age= 00000000 00000000 00000000 00001111
System.out.println(age);//15
2) Java 中的变量, Java是强类型语言,
A 变量必须声明,并且初始化以后使用
B 变量必须有明确的类型
C 变量不能重复定义
3) 变量的作用域
a 在声明的地方开始,到块结束为止
b 离开变量的作用域结束,变量将回收。
2. 进制转换基础
1) 十进制
逢10进1
基数: 10
权: 10^n, 10000 1000 100 10 1
23678(10) = 2*10000+3*1000+6*100+7*10+8*1
= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0
= 23679
2) 二进制
逢2进1
基数: 2
权: 2^n, 128 64 32 16 8 4 2 1
01000001(2) = 1*64 + 1*1
= 65(10)
3) 补码基础
-128 10000000 11111111 11111111 11111111 10000000
10 2进制 ... ...
8421 11110111 11111111 11111111 11111111 11110111
-8 1000 11111000 11111111 11111111 11111111 11111000
-7 1001 11111001 11111111 11111111 11111111 11111001
-6 1010 11111010 11111111 11111111 11111111 11111010
-5 1011 11111011 11111111 11111111 11111111 11111011
-4 1100 11111100 11111111 11111111 11111111 11111100
-3 1101 11111101 11111111 11111111 11111111 11111101
-2 1110 11111110 11111111 11111111 11111111 11111110
-1 1111 11111111 11111111 11111111 11111111 11111111
0 0000 00000000 00000000 00000000 00000000 00000000
1 0001 00000001 00000000 00000000 00000000 00000001
2 0010 00000010 00000000 00000000 00000000 00000010
3 0011 00000011 00000000 00000000 00000000 00000011
4 0100 00000100 00000000 00000000 00000000 00000100
5 0101 00000101 00000000 00000000 00000000 00000101
6 0110 00000110 00000000 00000000 00000000 00000110
7 0111 00000111 00000000 00000000 00000000 00000111
00001000 00000000 00000000 00000000 00001000
.... ...
127 01111111 00000000 00000000 00000000 01111111
128 -------- 00000000 00000000 00000000 10000000
补码运算:
-1 1111
-1 1111
*
----------
1111
1111
1111
1111
101010
-----------
0001
4) A Java 内部只有二进制补码
B Java 内部采用补码运算, 自动发送上溢出和下溢出
C Java内部没有10进制! 但是Java尽量按照人类习惯输入输出
D 补码的负数 最高位是 1, 也称作符号位
5) 16进制, 是2进制的简写, 方便专业人员书写2进制数据
16进制
逢16进1
基数: 16
权: 16^n, 256 16 1
16进制数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
41(16) = 4*16 + 1*1
= 65(10)
= 0100 0001(2)
8421 8421
4 1 (16)
128 64 32 16 8 4 2 1
0 1 0 0 0 0 0 1
练习:转换以下十进制为二进制 192(10) 137(10) 145(10)
192(10) = 1100 0000 (2)
c 0 (16)
-8(10) = fffffff8(16)
3. Java 数据类型: 分为引用类型和基本数据类型
1) 基本数据类型: 8种
byte, short, int, long
float, double
char
boolean
2) 整数类型 byte, short, int, long, 都是有符号(补码)整数
byte 8位补码 最大值 0x7f 127 最小值 0x80 -128
short 16位有符号数 0x7fff 32767 0x8000 -32768
int 32位 0x7fffffff 2G-1 2^31-1 21亿 0x80000000 -2G
long 64位 .... 0x7fffffffffffffff
整数字面量(直接量) 默认是int类型, 如果不超出范围, 可以给
小类型直接赋值.
使用整数类型(byte, short, int) 要注意取值范围, 超范围运算
java 底层byte,short 按照32位计算
long 类型的字面量使用"L","l" 后缀
3) 浮点数, 小数 (不必掌握 浮点数的存储方式)
浮点数原理: 10进制浮点数(科学计数法)原理
2356189. = 2.356189 * 10^6
概念: 尾数: 2.356189
指数: 6
基数: 10
pi = 3.14
3.1415926535897932384626433832
二进制浮点数:
101001010101. = 1.01001010101 * 2^1011
概念: 尾数: 1.01001010101
指数: 1011
基数: 2
float: 32位 其中: 1位符号位, 8位指数, 23位尾数
精度: 23 位
int max = 01111111 11111111 11111111 11111111
float f = 1.111111 11111111 11111111 1 * 2^00011110
double: 64位 其中: 1位符号位, 11位指数, 52位尾数
浮点数的字面量: 默认是double, D d 后缀是double, f F 是float
4) 字符类型 char, 字符是一个16位无符号整数, 是一个二进制数
数值是一个字符的unicode编码值.
unicode 编码: 是全球范围内的编码方法, 编制了英文, 中,日,韩
阿拉伯, 希伯来, ..... 8万+ 字符
中 : 20013
A : 65
其中英文部分与ASCII 兼容, 英文字符和数字是连续编码的.
ASCII: 0~128
Java char 的范围 0~65535 不能表示全部unicode 但是可以表示
unicode只能够最常用的部分
*最小值:0, 最大值:65535 = 2^16-1
*字符字面量使用单引号为定界符号:'中'
字面量也是整数常量!
特殊字符采用转义字符表示:
如: '\n' newLine 换行
'\r' return 回车
'\t' tab
'\\'
'\b' backspace
'\f' pagebreak
'\''
'\"' '\u4e2d'
char c = '\\';
'c' -> 'C'
'a'-'A' = x - X
X = x - ('a'-'A');
5) boolean 布尔类型 表达: 真(true)/假(false)
建议使用长变量名定义变量
boolean started = true;
boolean isMan = true;
isMan = false;
boolean used = true;//二手的
if(used){
System.out.println("打八折");
}
if(isMan){
//...
}
不建议 定义没有意义的变量
boolean u = true;//u = you
if(u){
//....
}
boolean flag = false;
if(flag){
System.out.println("打八折");
}
4. 数据类型转换
char ->
byte -> short -> int -> long -> float -> double
1) 自动类型转换,正方向,小类型到大类型的转换会自动完成
符号位会自动扩展, 负数补1, 正数补0, 保证补码数值不变
注意, 整数到浮点数转换会损失精确度
自动类型转换也叫"隐式类型转换", 是自动发生的, 一般不需要处理
int i = -1;
long l = i;
2) 强制类型转换(显示类型转换), 需求明确处理, 是按照反方向,进行
的转换, 这种转换会溢出, 或者损失精度. 要注意数据的范围
int i = 128+256;// 00000000 00000000 00000001 10000000
byte b = (byte)i;//-128
long l=0xf80000000L;
int c = (int)l;//负数
l = 8;
int d = (int)l;
float pi = (float)3.1415926535;//损失精度
char c = '0';
char x = (char)(c+2);
作业: 1 复习并且完成 全部 课堂演示代码, 添加适当的
输出语句, 研究输出结果, 添加适当的注释.
2 尝试 计算 10个以上 255 以内的整数转换为 2进制,
16进制,相互转换. 并且编程验证计算结果
提示: System.out.println(Integer.toHexString(234));
3 (选做)定义方法: 参数是一个整数类型, 没有返回值,在
方法中输出这个整数的10进制,2进制
,16进制字符串
4 (选做)尝试实现 day02.png 中的案例, 在周末提交结果
5 将人名字符的HEX编码输出, 手工转换为二进制, 并且验证结果
提示: 可以使用Scanner输入用户数据
预习: Java运算符, 流程控制语句. 参考Day03.txt