标识符和数据类型以及为什么float比long表示数据要大原理

标识符命名规则:

标识符只能以字母、下划线、美元符开头。以字母、下划线。美元符数字组合。大小写敏感。不能是关键词。

数据类型:

java中虽然说没有相关的指针概念但是大多数数据都是使用的指针。java是在c的基础上面 包装。

数据类型分为基本数据类型和引用数据类型。

基本数据类型:

1数值型

  1.1整数型:

       byte(一个字节范围-128-127)、short(两个字节范围-32768-32767)、int(四个字节范围-2^31-2^31-1)、long(-2^63-2^63-1)由于0占一个正位所以要减1。如果比long还要打的数需要用到(BigInteger 类)(引用数据)

  1.2浮点型:

       float(四个字节范围-3.403E38-3.403E38)、double(八个字节范围-1.798E308-1.798E308)

浮点数类型默认是double使用float可以加f结尾否则出现类型转化错误。浮点数表示的书存在误差。如果需要精确地小数则需要使用BigDecimal类(引用数据)。数据的比较最好不要用double因为可能出现误差比如float f=0.1;double f2=0.1/1.0;System.out.println(f==f2);输出的是fasle;因为不精确所以造成不一样。

2字符型:

   char(Unicode编码占用两个字节可以表示0-65535个字符)

char a='a';

int i = a+2;

System.out .println(i);

99

3布尔值:

 boolean(理论上占一位但java中并没有具体说是1位)

引用数据类型:(引用数据类型顾名思义--指针引用地址详细内容见内存详解)

1类:

class

2接口:

interface

3数组

注意事项:

关于同样是4个字节float比long要大很多的原因:long采用IEEE754编码第一位为正负号,之后8位表示指数数值,最后23位表示尾数位,8位指数位表示(0-255)0代表无穷小,255代表无穷大。指数位的表示:IEEE754采用偏差指数=指数+偏差方式,单精度的差值为127。这样以176.0625来作为例子计算.

176转化为2进制为10110000小数部分转化为2进制为0001所以176.0625转化为二进制为10110000.0001(少于23位)

小数点左边一位隐数(为了节省一个bit位)则表示为1.00110000001*2^7所以指数为7,则偏差指数=指数+偏差(单精度偏差为127)故偏差指数=134用二进制表示为10000110所以用IEEE754表示176.0625为0(正负号 )10000110 (指数位)  00110000001000000000000(尾数位).反过来计算显示10进制时候为:取符号位(-1)^0+((10000110)变10进制134)2^(134-127)*(1.00110000001000000000000)注意加上隐藏的1最后算的为176.0625这也就是为什么float不精确的原因.都是由2的次方数相加得来的当然不精确了例如(0.03)取23位二进制表示法(注意要保留隐藏一位后剩下的23位)经过计算得到的数值小于0.03但是接近于0.03。这样表示范围是确实变大了但是精确度却丢失了。

所以单精度的表示范围为-2^128*(1-2^-24)到2^128*(1-2^-24)(最高127指数位再加上尾数位全为1就是1.11111111111111111111111*2^127 =2^128(1-2^24))

注意事项2:

int a=10;

int b=010;(8进制以0开头所以该数字表示10 进制的8同样0x开头是16进制数)整型常量的默认值是int如果想要使用long字型需要加上L;如果数据没有超过byte 、int 、long取值范围则自动转型。超出范围需要强制转换否则提示类型转换错误。而且转换后的数据与想要的数据不同,这是因为超出的位数直接舍去(补码计算出来的)比如byte b=(byte)129那么129转化为二进制为(int 类型)00000000 00000000 00000000 10000001 舍去前面24位 剩下10000001 第一位符号位为负数(-1) 10000001是补码那么反码为10000000那么原码为11111111则计算为-127打印出来也是-127.

byte b=1; byte b2=2;byte b3; b3=b+b2;

提示类型转换错误。这是因为byte与byte,short,int,相加都会转化为int;这样就会造成大转小所造成的精度丢失问题。

byte b=3+6;

java编译器常量优化机制如果不超过byte则自动转化为byte

类型自行转化变大;

int a=9;

byte b=0;

int c= a+b;

a的内存显示:00000000  00000000 00000000 10000001

b的内存显示:00000000

相加的时候b会转化为int 类型00000000 00000000 00000000 00000000在跟a相加最后整体就是int类型

猜你喜欢

转载自blog.csdn.net/qq_35681797/article/details/81903112