疯狂java讲义请讲 笔记C3

Java中整数常量有4种表示方式:二进制(0b-)、八进制(0-)、十进制和十六进制(0x-),这里要强调的是,数值类型的赋值问题。
由于视觉上更直观,下面以二进制为例:
int a = 0b1000000011101001;
short b= (short) 0b1000000011101001;
byte c = (byte) 0b1000000011101001;
long d = 0b10000000000000000000000000000011;
long e = 0b10000000000000000000000000000011L;
依次输出,结果是??
33001
-32535
-23
-2147483645
2147483651

在讲解之前,首先强调一点:java处理数据类型,纯数字默认按int处理(4字节,32位),含有浮点数点或指数E的默认按double处理(8字节,64位);修改默认处理方式的方法是在数字后面加标识,如L标识long型、F标识float型。
在知道这一点的前提下,再来解析这几个变量的值。
首先看a、b、c、d。
要知道,"int a = 0b1000000011101001;"只是代码中的字符而已,并没有实际存储到计算机内存当中,那么当程序运行的时候,JVM需要首先把右边的值存储到计算机中,然后把它分配给变量a,重点就在于,在分配之前,JVM是如何把代码中的数据,保存到计算机内存中的。正如之前所言,对于整数类型,java默认使用的是int类型,所以当JVM拿到"0b1000000011101001"的时候,它首先把这个数据放到4字节的空间里存储,如果多于32位,高位舍去;如果少于32位,高位补0,据此可得a=0b00000000000000001000000011101001。好,在完成这个步骤之后,JVM再看,这个值赋于的变量是个什么类型:
①如果是更小的空间(如short),那就要进行高位舍去,如short b要舍弃高位16位,保留低位16位,即b=0b1000000011101001,-32535(d);再如byte c,则只能保留低位8位,即c=0b11101001[补],>>0b10010111[原],-23(d);
②如果是int,即空间大小相同,那正好,直接把原值拿了去,完美!a=0b00000000000000001000000011101001,33001(b)。
③重点!重点!重点!如果是更大的空间(比如long)呢,那么它会保持4个字节时存储的值,而多余出来的空间并不使用!这点由d的值就可以看出。如果使用的话,就要高位补0,就算一下看不出值是多少,至少也会是正数吧,然而结果却是一个大大的负数,所以由此断定,高位并未补0,空间没有完全使用。

再来看e。从输出结果也可以看出,d和e的结果并不相等,这又是怎么回事呢?
正如之前所强调的,加了L标识之后,java的整数类型处理方式就不再是int而是long了,那么JVM首先用一个8字节,64位的空间把值存储的内存中,根据多舍少补的原则,那么"0b10000000000000000000000000000011L"就变成了"0b0000000000000000000000000000000010000000000000000000000000000011",即2147483651(d)。

说了这么多,其实就是要理解文中强调的一点:java数据处理的默认类型,明白了这一点,对于输出的结果,应该就不难理解了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值