2.4.4-Java语言基础(数据类型)


java中的基本数据类型?各占多少位?多少字节?取值范围?

1.Int                32               4                   -2,147,483,648 ~ 2,147,483,647
2.Short          16                2                   -32768 ~ 32678
3.long            64                8                   -9,223,372,036,854,775,808~+9,223,372,036,854,775,807
4.float            32                4                   -3,40292347E+38 ~ +3,40292347E+38
5.double       64                8                   -1.79769313486231576E+308 ~ 1.79769313486231576E+308
6.char           16                2                    ‘\u0000′ ~ ‘\uFFFF’
7.boolean     1                 0.125              true/false
8.byte             8                 1                    -128 ~ 127

  1. 1.未带有字符后缀标识的整数默认为int类型;未带有字符后缀标识的浮点数默认为double类型。
  2. 2.如果一个整数的值超出了int类型能够表示的范围,则必须增加后缀“L”(不区分大小写,建议用大写,因为小写的L与阿拉伯数字1很容易混淆),表示为long型。
  3. 3.带有“F”(不区分大小写)后缀的整数和浮点数都是float类型的;带有“D”(不区分大小写)后缀的整数和浮点数都是double类型的。
  4. 4.编译器会在编译期对byte、short、int、long、float、double、char型变量的值进行检查,如果超出了它们的取值范围就会报错。
  5. 5.int型值可以赋给所有数值类型的变量;long型值可以赋给long、float、double类型的变量;float型值可以赋给float、double类型的变量;double型值只能赋给double类型变量。

补充:

class Demo01 
{
	public static void main(String[] args) 
	{
		//byte -- -128~127	
		//解决方案:把数据类型提升。	
		//我们可以通过把数据赋值给short,int,long来解决问题。
		//但是,我们不想这样做,就只想把数据赋值给byte类型。
		//数据类型转换
		//从大到小:所占用的字节数比数据类型所能表示的大。
		//从小到大:所占用的字节数比数据类型所能表示的小。
		//一个整数,默认是int类型。
		//也就是说这个130和300其实是int类型的
		//那么,现在你是把int类型赋值给byte类型,
		//也就是从大到小的赋值。这个时候,可能会有溢出。
		//因为你是4个字节的数据,而我只有1个。
		//如果不想使用提升数据类型的方式,那么, 我们就只能使用强制转换了
		//强制类型转换的应用场景:
		//在把一个大的数据类型的值赋值给小的数据类型的时候,需要使用强制类型转换。
		//使用格式是:
		//数据类型 变量 = (数据类型)值;

		byte b1 = (byte)130;//可能有数据溢出
		byte b2 = (byte)300;//可能有数据溢出
		System.out.println(b1);//-126
		System.out.println(b2);//44

		//现在我们解决了这个问题,请问大家是否都看懂了这个结果呢?
		
	}
}
/*

问题:为什么byte b1 = (byte)130;结果是-126呢?

思考:
	A:130这个数据默认是int类型的。
	B:在参与运算的时候,得变成补码表示。
	C:找到130的补码。通过观察数据,我们知道130是一个正数。
	D:正数的原码,反码,补码都相同。所以我们只要写出了130的原码就知道补码。
	E:写出130的原码。他的原码其实就是他的二进制表示。
		十进制的130	--	二进制数据来
		
		十进制到二进制:用十进制的数据除以2,直到商为0,余数反转。
	F:8421码?
		8个bit位的数据
		
		1	1	1	1	1	1	1	1
		128	64	32	16	8	4	2	1	

		1       0	0	0	0	0	1	0
	也就是130的二进制:
		00000000 00000000 00000000 10000010
	G:接下来我们把130给强制转换为了byte类型,那么,这个时候,就出问题了。
          byte类型占用1个字节。而我们的130现在占用的是4个字节。
	  所以,在强制转换的过程中,会有字节数据的丢失。
	  但是,我们不用搭理它。
	  直接按照我们的结果来看:
		00000000 00000000 00000000 10000010
	  强制转换为byte类型后,我们的结果就是
		10000010
	H:这个时候,我们看到了10000010。这个数据应该是补码形式存在的。
	  我们最终通过显示器看到的应该是原码。
          而最高位的1也透露了这个数其实是一个负数。
	  那么, 我们就应该按照刚才讲解的原码,反码,补码的规则
	  推出这个负数的原码表示。
	
	  补码:1 0000010
	  反码:1 0000001
	  原码:1 1111110 
        I:最终我们的数据值是:1 1111110 
	  而我们通过控制台看到的是十进制数据,所以,我们还要把改二进制转换为十进制。
		1 1111110
		最高位是符号位。所以,该数的结果是一个负数。
		
		128	64	32	16	8	4	2	1
		符号位	1	1	1	1	1	1	0
		-	64+32+16+8+4+2	
		-126

问题:
	为什么byte b2 = (byte)300 结果是44呢?
	
	第一步:把300的二进制写出来。	
		1	1	1	1	1	1	1	1	1
		256	128	64	32	16	8	4	2	1
		
		1	0	0	1	0	1	1	0	0
		
		300的二进制:
			00000000 00000000 00000001 00101100		
	第二步:所有数据的存储和操作都是补码形式。
		截取数据300。
		
		得到:00101100
		得到的是一个补码,而我们发现最高位是0,说明是一个正数。所以,这个补码其实也就是原码。
		所以,我们直接获取该值即可。

		128	64	32	16	8	4	2	1
		符号位	0	1	0	1	1	0	0
		+	32+8+4
		+44

byte 
	-128	-	127

	byte b = 127;
	byte b = (byte)128;//-128
	byte b = (byte)129;//-127
	byte b = (byte)130;//-126
*/

class Demo02 {
	/*
	 * 这是主函数,是程序的入口 它的出现可以保证程序的独立运行,
	 */
	public static void main(String[] args) {
		/*
		byte b = 1;
		byte c = 1;
		b = b + 1;		//int赋值到byte报错
		c++;
		System.out.println(b == c);
		*/
		
		/*
		//byte b = 127;
		//1是int类型的
		//1.JVM在进行定义的变量初始化时,首先检测右侧的数据自身的数据类型
		//与左侧的常量的数据类型之间是否存在有可转化的可能性
		//2.检测具有可转换性,检测左边的数据类型的范围-128 +127
		//3.检测左侧数据的值是否在范围内
		//4.如果在范围内,自动将左侧的数据转型成左侧的类型
		//5.如果不在范围内,报错
		*/
		
		/*
		byte b = 127;
		byte bs = b;
		//1.检测右边的数据类型是否与左边相同
		//如果相同,编译通过
		//如果不相同,编译失败
		*/

		byte b = 0;
  		byte c = 50;
  		// byte d = b + c; //编译报错,byte类型运算的时候自动转换为int类型
  		byte d = (byte) (b + c);
  		System.out.print(d);
	}
}

public class Test {

	/**
	 * byte 8 bits -128 - + 127 
	 * 1 bit = 1 二进制数据 
	 * 1 byte = 8 bit 
	 * 1 字母 = 1 byte = 8
	 * bit(位) 1 汉字 = 2 byte = 16 bit
	 */
	public static void main(String[] args) {
		byte b1 = 127;
		byte b2 = -128;
		byte b3 = 'a';
		byte b4 = 'A'; // 一个字母 = 1 byte = 8 bit
		System.out.println(b3); //输出97
		System.out.println(b4); //输出65
		// byte b5 ='aa'; 报错
		// byte b6 ='中'; 报错 一个汉字 2个字节 16bit
		short s1 = '中'; // 一个汉字 2个字节 16bit short 是 16 bit位的
		System.out.println(s1);
		// short s2 = '汉字'; // 2个汉字 4个字节 32 bit int 是32 bit的
		// int i1 = '汉字'; 但是 int 是数字类型的 , char 是 16 bit的 = 2 byte = 一个汉字
		char c1 = '中';
		System.out.println(c1);
	}

}



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值