基本数据类型

1Byte=8bit

名称封装类默认赋值占用字节位数范围
booleanfalse1Byte1bittrue、false
char02Byte16bit0 ~ 2 ^ 16 - 1
byte01Byte8bit-2 ^7~2 ^7-1
short02Byte16bit-2 ^15~2 ^15-1
int04Byte32bit-2 ^31~2 ^31-1
long08Byte64bit-2 ^63~2 ^63-1
float0.04Byte32bit大约:3.40E38~~1.4E-45
double0.08Byte64bit大约:1.80E308~~4.9E-324

long类型加“l”和不加“L”的区别?

通过实际操作我们会发现,下列两句代码都是可以通过编译的。

long l1 = 100;
long l2 = 100l;

而实际上l1和l2的值大小也是相等的。只不过,l1实际上是在用一个32位int字面量赋值。32位小于64位,所以可以兼容。而l2是真正用了一个64位长整型字面量值给一个64位长整型变量赋值,类型完全相同。

大部分情况下上述两种写法都可以,只有当等号右边的值或运算结果超出int可表示范围时才强制要求加“l”或“L”结尾。

【笔试题】请写出下列代码输出的结果?

System.out.println(5L * 1000 * 1000 * 1000 / 1000);

输出结果会溢出,前几步中已经计算结果达到50亿,超出了int可表示的范围。

问:最简单的想要得到正确结果的方法是什么?

用long类型计算。没有必要把所有的数字全部改成long类型,只需要把前四个数中的任何一个改成long类型即可。

在实际编程的过程中,即使明确知道有些数值取值不会太大,但是也不建议大量使用byte和short来表示。

虽然byte和short看起来长度比int要短,会节省一定空间,实际情况其实不然。

在字节码层面是没有byte和short这两种类型,在源代码中定义的byte和short在JVM中进行计算的时候实际上都会提升为32位int类型来计算。因为32位正好是4字节。每次分配4字节这样内存比较整齐,虽然有一定的内存浪费,但是这样分配空间计算起来效率会得到显著提升。

【笔试题】分析下列代码输出的结果:

byte b1 = 50;

byte b2 = 25;

byte b3 = b1 + b2;

System.out.println(b3);

答案:第三行编译报错,byte类型在参与运算时会被隐式地提升为int,两个int相加结果还是int。而int类型的结果75是无法直接赋值给byte类型的变量。

几个小案例:

byte b1 = 50;
byte b2 = 25;
int b3 = b1 + b2;
// 可以通过编译。b1 + b2的时候,两个byte不能直接相加。
// b1和b2都会被自动提升为默认的int类型。相加的结果也是int类型,可以直接赋值给等号左边的int变量。
byte b1 = 50;
byte b2 = 25;
int b3 = (int)b1 + b2;
// 把b1强转成32位int类型。可以这样做但是没有必要。
// 在这个案例中,b2也会被转换为int类型。但是和上面案例中的原因是不一样的。
// 因为运算符左右两侧要求位数相等,b1已经变成了32位,所以b2也会被隐式地提升为32位。
byte l1 = 50;
byte l2 = 25;
long l3 = (long)l1 + l2;
// 在这个案例中,l2会被提升成64位long类型参与运算。因为“+”左边是64位的。

关于强转的问题:

int b1 = 250;
int b2 = 500;
byte b3 = (byte)(b1 + b2); // int类型的750强转byte类型
System.out.println(b3); // 结果会输出-18

上述结果将750强转成byte类型,为什么输出了-18?

750 = 512 + 128 + 64 + 32 + 8 + 4 + 2 转换二进制位101110110

用32位表示: 00000000 00000000 00000010 11101110

所谓的强转成8位byte类型,就是把前面的24位直接砍掉,只留最低的8位。

那么数值大小就变成了11101110。

在计算机中byte类型属于有符号数,最高位用来表示正负。0代表正数,1代表负数。

原本一个正数,因为砍掉了24位,原本第八位代表数值大小的1现在变成了符号位。

所有这个数值经过强转之后变成了负数。

负数在计算机中使用补码的方式进行存储。

原码 = 补码 - 1 -> 除符号位取反

补码:11101110

反码:11101101

原码:10010010 (十进制中的-18)

byte类型占用8个二进制比特位,为什么取值范围是 -2 ^ 7 ~ 2 ^ 7 - 1?

在计算机最底层只有1和0两个数字,没有办法表示出正数和负数。所以只能把每个数值的最高位专门用作符号位。最高位为0代表是正数,最高位为1代表是负数。这样的数值称之为机器数或者有符号数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值