再回首 Java核心技术 2 —— Java数据类型和数字二进制表示

        时光飞逝,蓦然回首,Java 基础 似乎我都快记不起来了,希望这次能温故而知新,或是一些感动,或是一些惊喜,或重拾年轻时候的回忆。

        在 JVM 中,数据分为两大类:primitive types (原生类型)和 reference types(引用类型)。

Java 的 8种基本数据类型:

       在Java中,一共有8种基本类型 英文 : primitive type  ,primitive 原始的,朴实无华的,非派生的,在 计算机科学 Computer Science 中 有 “原” 的意义,所谓的 “原”, 我的理解是,这8种基础类型是非引用型的数据。

        其中,4个整数型 int,short , long ,byte ; 2个浮点型 double ,  float ,1个用来专门表示Unicode编码的字符单元的类型char,1个用于纪念布尔的真假的布尔类型。

整型:

Java整形
类型存储空间取值范围
byte1 *  byte字节    8bit位-2^7 ~ ( 2^7 -1) 
short2 *  byte字节   16bit位-2^15 ~  (2^15-1)
int4 * byte字节    32bit位-2^31 ~ (2^31-1)  
long 8 * byte字节    64bit位-2^63 ~ ( 2^63 -1) 

        学过C语言的兄弟,肯定首先就注意到了,Java中没有无符号整型的概念,都是带符号的。

        1 byte字节 等于 8 bit ;正数部分专门为了0,特意的减了一个1。int 类型最常用,这个也很好记,如果中国的人口加上印度的人口肯定超过了21.5亿人,这个时候肯定就是要溢出了。如果要用一个数字来代表地球上的人口,那这个类型只能是long。byte 和 short 类型 用于特定的应用场合,如:底层的文件处理 或者 需要控制占用存储空间量的大数组。

        long类型数字在后面可以后缀一个L,大小写皆可,来指明为long整型。0x或0X代表 16进制的数;8进制有一个前缀0,010就是8。从Java7开始,0b或0B可以代表二进制,0b1001就是9,同样从Java 7 开始,为了方便阅读,你可以在数字下面加入下划线,来方便你自己阅读代码。比如 1_0000_0000这就是曾经的首富王健林的一个小目标。

package com.cosyit.corejava.core1;

public class Main {

    public static void main(String[] args) {
        System.out.println(0b1001); // 9
        System.out.println(010); // 8
        System.out.println(0x10); // 16
        System.out.println(1_0000_0000);
       System.out.println(21_5000_0000L);//默认表示int ,加上l就不会有溢出的编译错误。

        //使用Integer的静态方法把10进制的 -3 转为二进制表示。
        String s = Integer.toBinaryString(-3);
    }
}

        关于二进制数字的转换,这个我在C/C++博客中写过,Go的博客中也写过,这里Java一样,也写一遍,计算机基础性的东西大家都一样的。

1.如何获取一个数的二进制表示:
有符号 int  第一位是0 则是正数,第一位是1 则为负数。
对于负数的绝对值,是符号位以外的部分取反后再加1。

需求: 我们想用8bit的二进制表示-3
做法: -3,负号的首位 毋庸置疑 设置为1 ,
现在就处理剩下7个bit

先表示3 000 0011
取反    111 1100  
加1     111 1101
添加上符号位  1111 1101


2.逆向过程,从一个二进制表示的负数  1111 1101 ,获取易读的表示(我觉得十进制更易读)

先看首位 是1,那么就写个负号 ,
再看剩下的7位数取反  0000010  ,这是2
再加1, 为得到绝对值为3,负号则乘以-1,我们可知其值为 -3.


精华就是:相互转换都一样的玩法,先搞定符号位,剩下位数取反加一。

浮点型:

类型存储空间取值范围
float4 * byte字节  32bit位约 -3.4E38F — +3.4E38F ,有效位数6-7位
double8 * byte字节  64bit位约-1.798E308~1.798E308 E308 ,有效位数15位

double类型的数值精度是float类型精度的两倍,固又被称为 双精度数值类型。

fload 大约只能表示7位十进制的数字,double 大约表示15位的十进制数据,所以绝大部分的应用程序都采用double类型,涉及金融的场景,大多数情况下,我们都会使用BigDecimal类,我们可以保证不会有精度缺失,否则公司的会计就会来找你麻烦了。

        编译器遇到小数类型,默认认为为double 类型。 fload的后缀为f | F,double数值 后缀为 d | D ,另外,比较两个浮点数是否相等,不能直接用 == 全等号。

二进制如何表示小数

 IEE754标准 规定了 如何以二进制的方式表示十进制的数字:

 这块比较绕:有兴趣的可以去看下视频: 什么是浮点数?10分钟彻底掌握浮点数的底层原理 #安员外读书会_哔哩哔哩_bilibili

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值