Java数据类型整理

先把自己整理的表格放出来:


*长整型带有L后缀。

*十六进制带有0x前缀,八进制0前缀,二进制0b前缀,十进制无前缀

八进制带有0前缀(容易混淆不建议使用)

可以直接运用在程序上,例如int i =0xF,会输出i=15,同样的会被认为是int型

*Java7之后的版本用0B或0b表示2进制,用_来让人们更方便的观察数字,(或者用两个_,__)Java编译器会自动的去掉这些下划线。

*Java没有任何无符号的整形。不存在unsigned。

容易犯的错误:

byte b=5;
b=b+0;//报错,int不能赋值给byte
b=b+(byte)0;//报错,byte运算时会自动变成int
b=(byte)(b+0)//正确的写法

*float,不常用。3.14f,double可以写成3.14或3.14d。

二进制和float

floaf在内存中占0000_0000_0000_0000_0000_0000_0000_0000 共4个字节。

左边第一位(红色)为浮点数的符号位。用s(sign)表示,占用1bit。值为0/1,0代表正数,1代表负数。

左边第2~9位(绿色部分)为指数位(阶码),用E(exponent)来表示。对于指数本来应该表示为0~2^8(即0~255),为了便于比较大小,所以阶码8位为无符号数。

左边第10~32位为尾数位,表示小数点后面的数值用M(mantissa)表示,默认为1.M。

为了使计算机内存统一加减法运算,(为了设置绝对值很大和绝对值很小的数,指数有正有负,但是表示正负无穷大阶码全1和正负零阶码全0两种情况,所以本来应该偏移128的,偏移了127)

IEEE754规定了以下概念:

首先应当知道,尾数有一个默认的整数位1(在阶码非0的情况下).二进制浮点数可以表示正负无穷大。


规约形式的浮点数:类似于科学计数法中0.04E-2(非约定形式),实际上应当表示为4E-4(约定形式)

非规约形式的浮点数:同上,当阶码全为0时,尾数的整数位就不是1了,自动变为0.(值得注意的是,非规约形式的指数偏移值比正常偏移值大1,即为126,同时尾数由1.M变为0.M)


负无穷:符号位为1,阶码为11111111,尾数位为0

正无穷:符号位为0,阶码为11111111,尾数位为0

机器零:尾数为0被看作机器零。(无法表示)

正零:符号位为0,阶码为0,尾数为0

负零:符号位为1,阶码为0,尾数为0

NAN:阶码为0,尾数非0,表示这不是一个数。





*二进制小数和十进制小数的互换。

61.63转换为二进制:

整数除以2,商继续除以2,得到0为止,将余数逆序排列;小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。

61/2……1……个位数

30/2……0

15/2……1

7/2……1

3/2……1

1/2……1

0/2……0……最高位(在此处无意义)

所以整数为111101

小数部分(到第23位即可)

0.63*2=1.26……1

0.26*2=0.52……0

0.52*2=1.04……1

0.04*2=0.08……0

0.08*2=0.16……0

0.16*2=0.32……0

0.32*2=0.64……0

0.64*2=1.28……1

0.28*2=0.56……0

0.56*2=1.12……1

0.12*2=0.24……0

0.24*2=0.48……0

0.48*2=0.96……0

0.96*2=1.92……1

0.92*2=1.84……1

0.84*2=1.68……1

0.68*2=1.36……1

0.36*2=0.72……0

0.72*2=1.44……1

0.44*2=0.88……0

0.88*2=1.76……1

0.76*2=1.32……1

0.32*2=0.64……0

0.64*2=1.28(开始循环了,已经到了第23位)

所以该数值是:11 1101.1010 0001 0100 0111 1010 110……

整理成科学计数法应该为1.1110 1101 0000 1010 0011 1101 0110*(10)^5

e=5+127=132=1000 0100

s=0

M(23位即可,从第二位开始数)=1110 1101 0000 1010 0011 110(24位非0进1)1 0110

浮点数为:0100 0010 0111 0110 1000 0101 0001 1111


110.1101转换为十进制:

乘2的次幂相加。

1*2^2+1*2^1+0*2^0+1*2^(-1)+1*2^(-2)+0*2^(-3)+1*2^(-4)=4+2+0.5+0.25+0.0625=6.8125

转成浮点数

1.1011 01*(10)^2

s=0

e=2+127=129=1000 0001

M=1011 0100 000000……

转换为0100 0000 1101 1010 0000 ……


*IEEE754标准

*一个正整数除以0的结果为正无穷大,计算0/0或者负数的平方根结果为NaN。

*Double.POSITIVE.INFINITY

*Double.NEGATIVE.INFINITY

*Double.NaN

*值得注意的是非数值的值都认为是不相等的,所以不能用if x==Double.NaN来判断,应当使用Double.isNaN(x)来判断。

*浮点很容易出现误差,所以应当少用。


Char类型。

*char类型原本表示单个字符,但是现在有些unicode字符可以用一个char来描述了。

*由于转义序列\u可以出现在加引号的字符常量或者字符串之外,其他所有序列不可以。所以\u容易引起错误,特别是注释中。

*现在16位的char字符集已经不能满足所有的unicode编码了。

char类型中描述了UTF-16编码的一个代码单元。但是感觉UTF-8更好。

utf-8是以8个比特做一个单元,utf-16是以16比特做一个单元。utf-8能表示变长的但最多是3个,但是utf-16也可以。

utf-8

单字节 0xxx xxxx——128个

双字节 11xx xxxx    10xx xxxx——4096个

三字节 1110 xxxx    10xx xxxx    10xx xxxx——65536个

utf-16

任何字节都用2个bit,所以空间占用稍多。优点是:不用做判断。


*char编码没怎么搞懂

*强烈建议不要在程序中使用char类型。

*在utf8中汉字占3个字节,英文占1个字节


*boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义。但是在class中是1个哦。大家更倾向于4个字节,

参考:https://stackoverflow.com/questions/1907318/why-is-javas-boolean-primitive-size-not-defined

*更新今天问了曾经在oracle的杜聚宾老师,老师表示实际上还是占用1字节。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值