Date :2018/11/24
发现javaSE的知识没有形成体系,所以回头认真地看一下
- 补码反码(补码可以参与运算:设计补码的初衷就是要表示数据的各位都参与运算,在给定的字长下配合一定的溢出规则来得到正确的结果.)
计算机的数值计算都是用补码计算的,
正数补码不变 负数为反码末位+1
0 0000111 +7 (原码)
1 0000111 -7(原码)
0 0000111 +7 (补码)
1 1111001 -7 (补码)
相加:
10 0000000(计算机只存8位,所以直接去掉第一个1)
- java基本数据类型(4类8种)
为什么javaqia
整数 一个字节8个比特
byte 一个字节 -2^7 到2 ^7-1(正数多了个0,所以减一)
Java中,为什么byte类型的取值范围为-128~127?
【 -1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的),使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。也就是说,这个10000000表示-128是人为规定的,不浪费-0的表示空间,而127+1也等于10000000,即-128】
short 两个字节 -2^15 到2^15-1
int 四个字节 -2^31 到2^31-1 (java中默认,存储long:long f = 8888888L)
long 八个字节 -2^63 到2^63-1
浮点
float 四个字节
double 八个字节(java中默认double,存储float:float f = 12.3f)
字符型
char 两个字节 0到65535
布尔型
boolean 理论上八分之一个字节,就是一个比特0/1,java中没有明确指出
百度云网盘是怎么加速的,网页登不上?????
- 强制类型转换需要和前面的变量同一个类型:
byte转int: 会损失精度
byte转int,因为byte1个字节,int是4个字节,只要在前面加上24个0就好了
00000000 00000000 00000000 【byte表示的二进制数】
int转byte
注:因为java默认整数类型为int,所以即使下面的x和a都是byte(或short,char等),还是出现错误,需要强制转换。但是因为字节变小了,在将加起来的数变成二进制后,要砍掉前面24个0,然后再算最后8个byte表示的数,下面算下来是
00000000 00000000 00000000 10000000
砍掉前面3个字节,然后10000000表示-128
并且,x和a是变量在运算时转化为int类型,结果也为int类型,有可能损失精度,而如果直接以常量方式,因为java编译器有常量优化机制,检测到在byte范围内,就可以正常输出:
byte = 3+4
如图,强制准换成byte:
再来个例子:(byte)(130) = ?(表示用原码,计算用补码)
130的二进制:00000000 00000000 00000000 100000010
砍掉前3个字节,补码:100000010
减一求反码:10000001
原码:111111110 即-126
再再来个例子:(byte)(300) = ?
300二进制表示为:00000000 00000000 00000001 00101100
砍掉前3个字节,补码:00101100
因为是正数,直接原码:00101100 即44
在计算的时候:前三个转int,小的转大的
byte,short、char --> int -->long–>float–>double
注:long八个字节,float四个字节,但是float有32位中,有1个符号为,24个尾数,8个指数位,00000000到11111111,范围在0到255之间,1到254,-126到127,即2^-126到 2^127之间
System.out.println('a') 输出 a
System.out.println('a' + 1) 输出 98(强制转换为int)
System.out.println((char)('a' + 1)) 输出 b
System.out.println("HELLO" + 'a' + 1) 输出HELLOa1(任何类型和字符串都会被转化为字符串)
System.out.println( 'a' + 1 + "hello" ) 输出98HELLO(计算从左往右)
System.out.println( "5 + 5 =" + 5 + 5) 输出 5+5=55
System.out.println( "5 + 5 =" + (5 + 5)) 输出 5+5=10
关于char
char c1 = 97;
System.out.println(c1);
输出 a
char的范围在0 - 65535之间,只要在这个范围内,都可以赋值成功,转化为char类型
拓展:java 采用unicode编码,char占两个字节,而中文单字也占两个字节,所以char可以存储中文单字符;
关于++ – 符号:
无论a++ 还是 ++a ,最后a都要+1
int a = 10;
int b = a++;
int c = ++a;
System.out.println(b); 输出 b = 10
System.out.println(c); 输出 c = 11
int x = 4;
int y = (x++) + (++x) + (x*10);
System.out.println(x);
System.out.println(y);
输出:x = 6 , y = 4 + 6 + 60 =70
#x在计算过程中还会变,会变!
关于++/–运算符的精度问题:
byte x = 4;
x++; #不会报错,java自动转换为 b =(byte)(b + 1)
x = x + 1; #会报错,int不能转换为byte
System.out.println(x);