java自学日记no.1

date:2020/2/11

位、字节、字

位、字节、字是计算机数据存储的单位,位是最小的存储单位,每一个位存储一个1位的二进制码,一个字节由8位组成,而字通常为16、32、64个位组成
位(bit)、字节(byte)、字(word)

原码、反码、补码

原码、反码、补码是机器存储一个具体数字的编码方式

原码

原码就是符号位加上真值的绝对值,
用第一位表示符号,其余位表示值

+1】原 = 0000 0001-1】原 = 1000 0001

反码

正数的反码就是原码本身
负数的反码是在原码的基础上,符号位不变,其余位取反

+1=0000 0001】原 =0000 0001】反
【-1=1000 0001】原 =1111 1110】反

补码

计算机采用补码进行运算

正数的补码就是原码本身
负数的补码是在原码的基础上,符号位不变,其余位取反,最后+1
即负数的补码是在反码的基础上+1

+1=0000 0001】原 =0000 0001】反 =0000 0001】补
【-1=1000 0001】原 =1111 1110】反 =1111 1111】补

负数的补码是其绝对值的补码求反,再+1

-1=1111 1111】补
【+1=0000 0001】补

常量、变量

常量

在程序运行过程中,其值不能发生改变的量

变量

在程序运行过程中,其值可以发生改变的量

区分常量与变量

public class JavaDemo {
	public static void main(String args[]) {
		int num = 10;
		num = 20;
		System.out.println(num * num);
	}
}

数字1020就是常量,这些内容永远都不会改变
num就是变量,可以修改变量num的内容

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

整数类型

byte 一个字节 -2 ^7 到 2 ^7-1(正数多了个0,所以减1)

short 两个字节 -2 ^15 到 2 ^15-1

int 四个字节 -2 ^31 到 2 ^31-1(Java中默认)

long 八个字节 -2 ^63 到 2 ^63-1

浮点类型

float 四个字节

double 八个字节(Java中默认)

字符类型

char 两个字节 0 到 65535

布尔类型

boolean 一个字节 true 或 false

强制类型转换

byte转int:会损失精度

byte转int,因为byte一个字节,int是四个字节,只要在前面加上24个0就好了
00000000 00000000 00000000【byte表示的二进制数】

int转byte

注:因为Java默认整数类型为int,所以即使下面的x和a都是byte(或short,char等),还是出现错误,需要强制转换。但是因为字节变小了,在将加起来的数变成二进制后,要砍掉前面24个0,然后再算最后8个byte表示的数,下面算下来是
00000000 00000000 00000000 10000000
砍掉前面3个字节,然后100000000表示-128

并且,x和a是变量在运算时转换为int类型,结果也为int类型,有可能损失精度,而如果直接以常量方式,因为Java编译器有常量优化机制,检测到在byte范围内,就可以正常输出:
byte = 3 + 4

public class LongTest {
	public static void main(String[] args){
		byte x = 127;
		byte a = 1;
		a = x + a;
		System.out.println(a);
	}
}

如图,强制转化为byte:

public class LongTest {
	public class void main(String[] args){
		byte x = 127;
		byte a = 1;
		a = (byte) (x + a);
		System.out.println(a);
	}
}

再来个例子:(byte)(130) = ?(表示用原码,计算用补码)

130的二进制:00000000 00000000 00000000 10000010
砍掉前三个字节,补码:10000010
减一求反码:10000001
原码:11111110-126

再再来个例子:(byte)(300) = ?

300二进制表示为:00000000 00000000 00000001 00101100
砍掉前三个字节,补码:00101100
因为是正数,直接原码:0010110044

在计算的时候:前三个转int,小的转大的
byte,short,char --> int --> long --> float -->double

注:long八个字节,float四个字节,在float32位中,有1个符号位,23个尾数,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

a++是先参与运算,然后+1
++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在计算过程中还会变
发布了38 篇原创文章 · 获赞 4 · 访问量 846

猜你喜欢

转载自blog.csdn.net/Hide111/article/details/104268209