Java的基本数据类型

java中存在八种基本数据类型

整形

类型存储需求取值范围
byte1字节-27 ~ 27-1
short4字节-215 ~ 215-1
int4字节-231 ~ 231-1
long8字节-263 ~ 263-1
四种类型的取值范围解析

以byte为例

byte占一个字节,即八位二进制位,其中最左边的第一位是符号位,后面的七位是数值位

0-0000000


在计算机中若用原码相加减,正数相加不会出错,然而正数和负数原码相加就会出错,例如:

8 - 1 = 8 + (-1)= 00001000 + 10000001 = 10001001 = -9(原码计算);计算错误

所以计算机引入了原码、反码、补码的概念

8 - 1 = 8 + (-1)= 00001000 + 111111111 = 00000111 = 7 (补码计算);计算正确


原码、补码、反码更加详细的解释

总结:

byte的取值范围是-27~27-1,即-128~127而不是-127~127,对于short、int、long取值范围算法都一样

在通常情况下int最常用,但是当表示地球人口时,六七十亿的人口已经超过了int最大的范围了,所以去要利用long表示,而当如处理底层的文件或者需要控制存储空间量的最大数组这种特定的应用场合时,即可以用byte或者short

当利用long时,需要在数值加一个l或者L后缀,如long num=1234567890l;从Java7开始,可以为数字字面量加下划线,如100_0000表示一百万(国外通常喜欢三位,即“千”画一下,而国内通常习惯四位,即“万”画一下)这样让人更容易读,Java编译器会自动将这些下划线去掉

浮点类型

类型存储需求取值范围
float4字节-2128 ~ 2128
double8字节-21024 ~ 21024

浮点数在存储与整形有差异

float:单精度数值

float的占4byte即32位

0-00000000-00000000000000000000000

从左边开始,其中第一位为符号位,第二位到第九位为指数位,后面的23位为尾数位

IEEE754标准规定符号位S用0和1分别表示正和负,尾数M用原码表示,阶码E用移码-1表示。根据浮点数的规格化1方法,尾数域的最高有效位总是1,由此,该标准约定这一位不予存储,而是认为隐藏在小数点的左边,因此,尾数域所表示的值是1.M(实际存储的是M)

指数必须是有号数才能表达很大或很小的数值,但是有号数通常的表示法——补码,将会使比较变得困难。为了解决这个问题,指数在存储之前需要做偏差修正,将它的值调整到一个无符号数的范围内以便进行比较而IEEE754标准规定这个偏移值为27-1(对于float)

在八位无符号位表示的数的范围为0~255,但是IEEE规定,当指数为全0——0000 0000时该浮点数能表示的最接近0的数为±1.M*2-127,于是就规定为该数就是0,即非规格化,所以指数不能是全0状态全1——1111 1111时,IEEE又规定为该数是无穷,根据符号为,分正负无穷,所以也化为非规格化,不能取,所以指数范围只能是1~254,减去偏移值,所以指数的实际值范围是-126到127

所以float的最大值应该是除符号位以外都是1的数,即,0_11111111_11111111111111111111111=(2-2-23)*2127即约等于
2128即3.40282347E+38F;

所以float的取值范围为-2128 ~2128,由于位数是23位,且规格化时,前面的一个1省略掉了,即严格来说是24位,所以float能表示的最大值为224=16777216,即八位数,所以float能表示的有效数为7~8位,同理double的有效位是15~16位

double的范围计算方式和float是一样的

其中float在java中初始化时,需要带一个“f”或者“F”后缀吗,例

float f = 3.1415f;

而不加f的默认为都变了类型的。

字符型

char原本用于表示单个字符符号,,但是现在情况发生了变法,如今有些Unicode字符可以用一个char,而有些需要两个char,

其字面量值要用单引号括起来,如’A’,‘B’,‘5’,如果不用单引号而是双引号如"A",表示的是一个字符串,而不是字符,在Java中,与C++不同的是,字符串不是字符的数组,所以要区别对待。

字符型char占两个字节,16位,其值可以表示为十六进制,范围从\u0000到\Ufff,“\u”为Java里的转义字符,常见的还以字符如下:

转义字符名称Unicode值
\b退格\u0008
\t制表\u0009
\n换行\u000a
\r回车\u000d
\"双引号\u0022
\'单引号\u0027
\\反斜杠\u005c

布尔型

boolean(布尔)类型有两个值:false与true,用来判断逻辑条件整形与布尔类型之间不可以转换。

在C++中,数值是可以代替boolean值的,值0相当于false,非0相当于true,但是在Java中,则不行,在Java中,当你写if(1)时,会报错,错误为,if里面必须填写一个布尔类型,所以在Java中,是不允许布尔值与整形之间的转换的。


  1. 规格化:若不对浮点数的表示做出明确规定,同一个浮点数的表示就不是惟一的。例如:3.75(10)=11.11× 20(2)=1.111×21=0.1111×22=0.01111×23
    为了提高数据的表示精度,需要充分利用尾数的有效位数。当尾数的值不为0时,尾数域的最高有效位应为1,否则就要用修改阶码同时左右移动小数点的办法,使其变成符合这一要求的表示形式,这称为浮点数的规格化。 ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值