Java 基本数据类型

目录

1、八种基本数据类型

八种数据类型分别是:(整数型) byteshortintlong,(浮点型)floatdouble,(布尔型) boolean,(字符)char.

byte:
  • 数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最大表示127 即(2^7 - 1),最小表示 -128 即(- 2^7).默认值为零.
/**
* 获取byte的最大值和最小值和默认值.
*/
public class DataTypeTest {

    private static byte b;    //这里并没有给b赋值,打印出来会是byte的默认值
    public static void main(String[] args) {
        System.out.println(Byte.MAX_VALUE);
        System.out.println(Byte.MIN_VALUE);
        System.out.println(b);
    }
}

输出结果如下:


取值运行结果
short :
  • 数据类型是16位、有符号的,以二进制补码表示的整数;
  • 最大表示32767即(2^15 - 1),最小表示 -32768即(- 2^15).默认值为零.
    (和上面一样可以用Short类取到最大值和最小值)
int (默认整数):
  • 数据类型是32位、有符号的,以二进制补码表示的整数;
  • 最大表示2147483647即(2^31 - 1),最小表示 -2147483648即(- 2^31).默认值为零.
    (用Integer类取到最大值和最小值)
long :
  • 数据类型是64位、有符号的,以二进制补码表示的整数;
  • 最大表示9223372036854775807即(2^63 - 1),最小表示 -9223372036854775808即(- 2^63).默认值为零.
    (用Long类取到最大值和最小值)
float :
  • 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • 精度:小数点后6~7位。
double(默认浮点型) :
  • 数据类型是单精度、64位、符合IEEE 754标准的浮点数;
  • 精度:小数点后15~16位.
char :
  • char类型是一个单一的 16 位 Unicode 字符
boolean :
  • 只有两个取值:true 和 false,默认为false;
  • 常用作标记.

2、整数类型在java语言中的表示方法。

使用二进制表示整数类型常量。

在jdk1.7之前之前不支持使用二进制表示数值,但在jdk1.7和之后版本,可以使用 0b前缀表示二进制数字。并且可以使用 下划线 “_”来将数字分开,方便阅读。

    //Jdk1.7 及之后版本呢支持使用 0b开头来使用二进制表示整型常量
    byte b = (byte)0b0111_1111;
    System.out.println(b)
    // 输出结果: 127
使用八进制表示
    // 使用前缀0 来八进制表示整数
    int i = 01234_4321;
    System.out.println(i)
    //result :2738385
使用十进制表示
    // 平常使用
    int i = 123456;
    System.out.println(i)
    //result :123456
使用十六进制表示
    // 使用前缀0x 来八进制表示整数
    long l = 0x1234_5678_9abcL;
    System.out.println(l)
    //result :20015998343868

3、关于byte、short、int、long和float、double的最大值和最小值问题。

关于整数类型,以byte为例,其他三种short,int,long与byte类似。

byte用二进制表示时占8个bit,也就说任何byte类型数字都可以用8位二进制数字表示,即0000_0000 ~ 1111_1111 之间的数字表示byte类型可以取到的所有数字。
但是1111_1111 表示的是十进制数字255,为什么byte最大取值是127?
  因为byte是由符号的,既可以表示整数也可以表示负数,因此在表示byte的8位二进制数字中第一位表示正负关系(0表示正,1表示负),剩下的7位表示数值大小.所以byte可以取到的最大值位 0111_1111 即 +127 最小可取到的值位1000_0000即-128(1111_1111 表示-1).

表示正负(第1位) 表示数值(2~8位)
0/1 0000000~1111111
关于浮点型float和double的最值问题。

参考:IEEE754浮点数的表示方法
   wiki IEEE754
>  要搞清楚float和double的最值和精度问题,首先要明白在IEEE754协议里浮点数转换成二进制表示的格式。
  和整型一样,浮点型转为二进制表示时第一位也表正负,但是之后中间8位(double是11位是指数位)表示指数位也叫阶码,剩下的表示尾数位。

float (32位)
1bit 8bit 23bit
符号位 指数位 尾数位
double (64位)
1bit 11bit 52bit
符号位 指数位 尾数位

其实在尾数位前面应该还有一位,不过通常都表示1,所以省略未写。

32位浮点数真值计算公式

64位浮点数真值计算公式

  其中尾数域表示的值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。
  在计算指数e时,对阶码E的计算采用源码的计算方式,因此32位浮点数的8bits的阶码E的取值范围是0到255, 偏移量127,偏移量的功能是可以将e表示成负数。

我们直接通过计算将浮点数转换成二进制机器码来看看设个公式是使用的。


浮点数转二进制

32位机器码表示浮点数

上面就是浮点数求出32位机器码的过程,反过来我们也可以根据根据32位机器码来求出浮点数的大小.
我们就以32位二进制能表示的最大的数值为例(注意这个值并不是float的最大值)
1111_1111_1111_1111_1111_1111_1111_1111 的浮点数

32位机器码转浮点数

  32位机器码转浮点数的算法就如上面的计算过程,不过应该注意到的是
上面求到的x的绝对值和float的正值最大值并不相等

        //通过float的包装类Float打印出float的最大值
       System.out.println(Float.MAX_VALUE);
       
      //result : 3.4028235E38

可以看出我们求得到的x的绝对值是float最大值的2倍,而原因是因为IEEE 754 协议的特殊规定!
  IEEE 754协议规定把指数位取值为 0和255时做特殊处理,也就是当公式中E = 0 和 E = 255 时有另外的规定算方法(在下面会有说明),所以 在32位机器码转float计算时:
正值情况可以取到的最大值为 0 11111110 11111111111111111111111
正值情况可以取到的最小值为 0 00000001 00000000000000000000000
负值情况可以取到的最大值为 1 00000001 00000000000000000000000
负值情况可以取到的最小值为 1 11111110 11111111111111111111111

float的正值最值

上面就是float可取的最大正值和最小正值,负数的情况计算方法相同,这也是在Float类中MAX_VALUE,MIN_VALUE 的规定数值
Float类规定的最值

 
对于阶码E为0或255的情况,IEEE754标准有特别的规定:

  1. 阶码E=0并且尾数M是0,则这个数的真值为±0(正负号和数符位有关)。
    因此+0的机器码为:0 00000000 000 0000 0000 0000 0000。
    -0的机器码为:1 00000000 000 0000 0000 0000 0000。
    需要注意一点,浮点数不能精确表示0,而是以很小的数来近似表示0。

  2. +∞和−∞的表示
    如果阶码E=255 并且尾数M全是0,则这个数的真值为±∞(同样和符号位有关)。因此+∞的机器码为:0 11111111 000 0000 0000 0000 0000。-∞的机器吗为:1 11111111 000 0000 0000 0000 0000。
    对应的 Float.POSITIVE_INFINITY 和 Float.NEGATIVE_INFINITY

  3. NaN(Not a Number)
    如果 E = 255 并且 M 不是0,则这不是一个数(NaN)。
    对应的是 Float.NaN;

下面是wiki给的IEEE754规定下单精度浮点数的一些值


单精度浮点数的一些值

双精度浮点数的最值和单精度类似,只是指数位,尾数位,偏移量都有所不同。

4、关于float和double的精度问题和浮点数运算时精度丢失问题。

在这里,我们还是以float为例来说明,double的情况和float类似。
从上面float的最值问题中我们已经知道float的在计算机中采用32位二进制的机器码来表示,并且知道她的取值范围大概是


float的取值范围

float和double相对应的十进制有效数字分别为7位和17位

float的精度由尾数位决定,尾数位一共占23bit,对应到十进制是7~8位,所以float可以保证7位的有效数字。
关于精度的问题还是有疑问!!!!!!!!
关于精度缺失问题
首先我们要明白的,在大多数情况下float的值和它对应二进制机器码所表示的浮点数值并不相等。

0.2的机器码并不等于0.2

这也是 2.0f - 1.9f = 0.100000024f 而不是0.1f的原因。
  事实上,绝大多数的浮点数并不能准确的求出它的32位机器码,因为其小数部分表示成二进制时,很可能是超过23位,或者出现无限和无限循环的情况,但是尾数码只有23位,超过23位的都被舍去掉了,因此造成了精度缺失的情况!
那什么情况下浮点数可以被精确的储存在计算机上呢?
  就是当浮点数的小数位在用二进制表示时,可以用23位尾数完全表示,而不存在舍去数值的情况下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 目录:1.基本数据类型2.引用数据类型 数据类型: Java语言是一个强类型语言 1.所有变量,必须先声明类型...
    Ansaxnsy阅读 984评论 0 7
  • 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存...
    Roc_J阅读 578评论 0 1
  • 前言: 1.变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。2.内存管理系统根据变量的...
    梦之志阅读 421评论 0 0
  • 孕育生命的天职 象太阳热恋着大地 被激情的火焰燃烧 我的地在这热浪中被播过 却浑然不知 一切的一切开始裂变 ...
    子良_b739阅读 246评论 0 1
  • 前面有篇文章,我记录了和一位闺密的矛盾处。也确实,成为了无形的裂痕,人相隔千里,情感相隔万里。 她劝我不要从事现在...
    孩子气的神_华丽丽阅读 127评论 0 2