Java 从零开始 2.2 整型

1.Java 的进制表示

(1)十进制: 无需特殊的表示方法,默认数字为十进制

(2)八进制:以0为开头表示八进制

(3)十六进制:以0x为开头表示十六进制

例如:
 

public class test
{
	public static void main(String[] args)
	{
		int a = 10;
		int b = 010;
		int c = 0x10;
		System.out.printf("a = %d\n", a);
		System.out.printf("b = %d\n", b);
		System.out.printf("c = %d\n", c);
	}
}

其中a、b、c分别为十进制、八进制、十六进制,运行结果如下:

可以看到输出结果不同,且可以得知输出默认为十进制

2.整型间的类型转换

(1)在Java中数字若没有特殊的表示则默认为int类型,而在数字后以L结尾则表示数字为long类型。

例如:

public class test
{
	public static void main(String[] args)
	{
		long a = 100;
		System.out.printf("a = %d\n", a);
	}
}

 在语句 long a = 100;中涉及到了语句的转换

100没有加L修饰表示int类型,而a声明为long类型,将int类型赋值给long类型涉及到了进制转换。

而int是4个字节,long是8个字节,由小容量向大容量可以默认进行类型转换。

运行结果如下:

 

 可以看到正常输出了结果。

但如果我们稍作修改:

public class test
{
	public static void main(String[] args)
	{
		long a = 2147483648;
		System.out.printf("a = %d\n", a);
	}
}

运行结果如下:​​​​​​​

 

可以看到运行出错了

为什么同样的操作会出现错误呢?

这是因为int类型的范围 为-2^31 到 2^31 - 1 

而2147483648比2147483647更大超出了int类型的范围所以导致编译出错

虽然long类型范围足够大,但由于没有添加L后缀,程序还没有运行到赋值这一步就出错了

我们再修改一下:

在数字后添加上L

public class test
{
	public static void main(String[] args)
	{
		long a = 2147483648L;
		System.out.printf("a = %d\n", a);
	}
}

结果如下:​​​​​​​

 可以看到运行成功了

值得注意的是小写的l一样可以取得相同的结果

所以,我们应该注意在给long赋值的时候最好在数字之后添加上L后缀,以避免出错。

(2)强制类型转换

当我们试图将一个long类型的值赋值给int类型时

例如:

public class test
{
	public static void main(String[] args)
	{
		int a = 1546L;
		System.out.printf("a = %d\n", a);
	}
}

结果如下:

 

可以看到这是不被允许的,一个大容量的数据不允许赋值给一个小容量的变量。

但我们可以通过强制类型转换的方式,进行类型的转换,代码如下:

public class test
{
	public static void main(String[] args)
	{
		int a = (int)1546L;
		System.out.printf("a = %d\n", a);
	}
}

 结果如下:

 

可以看到通过添加(int)进行强制类型转换,可以帮助我们通过编译,以达到程序可以顺利运行的目的

但是这种方式也会导致一定的问题,如以下代码:
 

public class test
{
	public static void main(String[] args)
	{
		int a = (int)2147483648L;
		System.out.printf("a = %d\n", a);
	}
}

 结果如下:​​​​​​​

 

 可以看到我们输入的明明是2147483648,而得到的居然是-2147483648,输入一个正数居然得到的是一个负数,这样的错误不可能被接受。

而导致这个错误的原因是,当我们把八字节的long类型转换成四字节的int类型时,损失了高位的四个字节的数据。并且由于整型最左侧的一位表示符号位,而2147483648在long中高位的四个字节都为0,低位4个字节都为1,符号位即最高位为0,是正数。而在int中全为1,符号位为1,是负数。

也就是说如果我们的数据本身处于int类型的范围内,强制转换不会导致错误,而在范围之外,会导致较为严重的精度损失。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值