关于JAVA的整数型4种数据类型:byte, short,int, long

/*

关于java语言中的整数型:

	数据类型		占用空间大小		默认值		 取值范围

		byte			1					0			[-128 ~ 127]
		short			2					0			[-32768 ~ 32767] 
		int				4					0			[-2147483648 ~ 2147483647]
		long			8					0L			
  1. JAVA语言当中的“整数型字面值”被默认当做int类型类处理,要让这个“整数型字面值”被当做long类型来处理,
    需要在“整数型字面值”后面添加l/L,建议使用大写的L。

  2. JAVA语言当中的整数型字面值有三种表示方式:
    第一种方式:十进制【是一种缺省默认的方式】
    第二种方式:八进制【在编写八进制整数型字面值的时候,需要以0开始】
    第三种方式:十六进制【在编写十六进制整数型字面值的时候,需要以0x开始】

*/

public class test3
{
public static void main(String[] args)
{
int a = 10;
int b = 010; //整数型字面值以0开头的,后面那一串数字就是八进制形式
int c = 0x10; //整数型字面值以0x开头的,后面那一串数字就是十六进制形式

	System.out.println(a); //10
	System.out.println(b); //8
	System.out.println(c); //16

	System.out.println(a + b + c); //34
	
	//123这个整数型字面值是int类型
	//i变量声明的时候也是int类型
	//int类型的123赋值给int类型的变量i,不存在类型转换

	int i = 123;
	System.out.println(i);
	
	//456这个整数型字面值是int类型,占用4个字节
	//x变量在声明的时候是long类型,占用8个字节
	//int类型的字面值456赋值给long类型的变量x,存在类型转换
	//int类型转换成long类型
	//int类型是小容量
	//long类型是大容量
	//小容量可以自动转换成大容量,称为“自动类型转换”机制。
	long x = 456;
	System.out.println(x);
	
	//2147483647字面值是int类型,占用4个字节
	//y是long类型,占用8个字节,自动类型转换
	long y = 2147483647;
	System.out.println(y);

	//编译错误:过大的整数:2147483648
	//2147483648被当做int类型4个字节处理,但是这个字面值超过int类型范围
	//long z = 2147483648;
	//System.out.println(z);

	//解决错误
	//2147483648字面值一上来就当做long类型来处理,在字面值后面添加L
	//2147483648L是8个字节的long类型
	//z是long类型变量,以下程序不存在类型转换
	long z = 2147483648L;
	System.out.println(z);

	//100L是long类型字面值
	//x是long类型变量
	//不存在类型转换,直接赋值
	long x1 = 100L;
	
	//x变量是long类型,8个字节
	//y变量是int类型,4个字节
	//以下程序能编译通过吗?
	//编译报错:大容量不能直接赋值给小容量
	//int y = x;

	//大容量转换成小容量,需要进行强制类型转换
	//强制类型转换需要加“强制类型转换符”
	//加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度。
	//所以,强制类型转换谨慎使用,因为损失精度之后可能损失很严重
	//强转原理:
		//原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
		//强转之后的数据:00000000 00000000 00000000 01100100
		//将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
	
	int y1 = (int) x1;
	System.out.println(y1);

	//原始数据:00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
	//以上数据计算方法是:int类型最大值2147483647,为 01111111 11111111 11111111 11111111
	//那么,2147483648L就是2147483647加上1,得出10000000 00000000 00000000 00000000
	//强转之后的数据:10000000 00000000 00000000 00000000
	//10000000 00000000 00000000 00000000目前存储在计算机内容,计算机存储数据都是采用补码的形式存储
	//所以10000000 00000000 00000000 00000000现在是一个补码形式
	//将以上的补码转换到原码就是最终的结果

	long k = 2147483648L;
	int e = (int)k;
	System.out.println(e); //损失精度严重,结果是负数【-2147483648】


	//分析以下程序是否可以编译通过?
	//依据目前所学内容,以下程序时无法编译通过的
	//理由:50是int类型的字面值,b是byte类型的变量,显然是大容量int转换成小容量byte
	//大容量转成小容量是需要添加强制类型转换符的,以下程序没有添加强转符号,所有编译错误。
	//但是,在实际编译的时候,以下代码编译通过了,这说明:在java语言当中,当一个整数型字面值
	//没有超过byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量。
	byte b1 = 50; //可以
	
	byte c1 =127; //可以

	//编译报错,128这个int类型的字面值已经超过了byte类型的取值范围,不能直接赋值给byte类型的变量。
	//byte c2 =128;
	//纠正错误,需要使用强制类型转换符
	//但是一定会损失精度
	//原始数据:00000000 00000000 00000000 10000000
	//强转之后:10000000【这是存储在计算机内部的,这是一个补码,它的原码是什么?】

	byte c2 =(byte)128; //-128
	System.out.println(c2);

	/*
		计算机二进制有三种表示形式:
			原码
			反码
			补码
		计算机在任何情况下底层表示和存储数据的时候采用了补码形式。
		正数的补码:和原码相同。
		负数的补码:负数的绝对值对应的二进制码所有二进制位取反,再加1

	补码:10000000
	原码计算过程:
		1. 补码:10000000 - 1 --> 01111111
		2. 反码:10000000 -->128
		3. 原码:-128

	*/

	byte m = (byte)198;
	System.out.println(m);

	//198的int二进制:00000000 00000000 00000000 11000110
	//强制类型转换之后:11000110
	//11000110现在在计算机当中存储,它是一个补码,将补码转换成原码就是该数字:
	//强制类型转换之后:11000110 - 1 --> 强制类型转换之后:11000101
	//取反:00111010 【2+8+16+32】-->58
	// -58

	short s = 32767; //通过
	System.out.println(s+"------------------------");
	//short s1 = 32768; //编译报错
	
	//65535是int类型,4个字节
	//cc是char类型,2个字节
	//按照以前所学知识点来说,以下程序时编译报错的。
	//char cc = 65535; //通过
	//cc = a65536; //编译报错
	
	char cc = 65535;
	System.out.println(cc);

	//char cc1= 65536;
	//System.out.println(cc1);

	//当一个整数字面值没有超过byte, short的取值范围,这个字面值可以直接赋值给
	//byte, short类型的变量,这种机制SUN公司允许了,目的是方便程序员进行编程。


}

}

你可能感兴趣的:(JAVA开发)