Java编程拾遗『Java基本数据类型』

69 篇文章 1 订阅
59 篇文章 0 订阅

Java是一种强类型的语言,这就意味着必须为每一个变量声明一种变量类型。在Java中,一共存在8种基本数据类型,其中4种整型、2种浮点型、1种用于表示Unicode编码的字符单元的自负类型char和一种用于表示真值的bollean类型。

1. 数据类型

1.1 整型

类型大小取值范围
byte1字节-128 ~ 127
short2字节-32 768 ~ 32 767
int4字节-2 147 483 648 ~ 2 147 483 647(正好超过20亿)
long8字节-9 223 372 036 854 775 808 ~  -9 223 372 036 854 775 807

在Java种,整型的范围与运行Java代码的机器无关,这很好地解决了软件从一个平台移植到另一个平台的诸多问题。比如C和C++程序需要针对不同的处理器选择最为有效的整型,这就有可能造成一个32为的处理器上运行很好的C程序在16位操作系统上运行却发生整数溢出。由于Java程序必须保证在所有的机器上都能够得到相同的运行结果,所以每一种数据类型的取之范围必须固定。

长整型数值有一个后缀L(如400000L),十六进制数值有一个前缀0x(如0xCAFE),八进制数值有一个前缀0,例如010对应八进制种的8。很显然,八进制的表示方法比较容易混淆,建议最好不要使用八进制常数。二进制数值有一个前缀0b,例如ob1001表示十进制数9。

1.2 浮点类型

类型大小取值范围
float4字节大约±3.402 823 47E + 38F(有效位数为6~7位)
double8字节大约±1.797 693 134 862 315 70E + 308(有效位数为15位)

float类型的数值有一个后缀F(例如3.14F),没有后缀F的浮点数值(例如3.14)默认为double类型。在JDK5中,可以使用十六进制表示浮点数值。例如0.125可以表示为0x1.0p-3,其中p表示指数,尾数采用十六进制,指数采用十进制,指数的基数是2,所以0x1.0p-3表示1.0 * 2^-3。

另外要注意的是,浮点数不适用于禁止出现舍入误差的金融计算中。例如,命令System.out.println(2.0 – 0.1)将打印出0.899999999999,而不是0.9。主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确表示分数1/10。就好像十进制系统无法精确的表示1/3一样。如果需要在计算数值中不包含任何舍入误差,就应该使用BigDecimal类。

1.3 char类型

char类型泳衣表示单个字符,通常用来表示字符常量,比如’A’表示Unicode编码为65所对应的字符常量。另外Unicode编码单元可以表示为十六进制,范围从\u0000到\uffff,例如:\u2122表示注册符号(™)。

除了可以使用转义序列符\u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义字符,如下:

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

Java中char字符占两个字节,这也是为什么一个字符可以表示一个中文汉字的原因。想了解编码的同学可以去看一下这篇文章深入分析 Java 中的中文编码问题 

1.4 boolean类型

boolean(布尔)类型有两个值,true和false,用来判断逻辑条件。整型数值和布尔值不能相互进行转换。java规范中,没有明确指出boolean的大小。在《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

2. 数值类型之间的相互转换

以上提到的四种数据类型,除了boolean类型外,之间都可以相互转换。在程序运行时,经常需要将一种类型转换成另一种类型。类型之间的转换又可以分为自动类型转换和强制类型转换。

2.1 自动类型转换


上图中5个实心箭头表示无信息丢失转换,3个虚箭头表示可能会有精度损失。例如123 456 789为一个大整数,它所包含的位数比float类型所能表达的位数多。当这个整型类型转换为float类型时,将会得到同样大小的结果,但却损失了一定的精度。当使用上面两个数值进行二元操作时(如 n + f,n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。

  • 如果两个操作数中有一个是double类型,另一个操作数就会转换成double类型
  • 否则,如果其中一个操作数是float类型,另一个操作数就会转换成float类型
  • 否则,如果其中一个操作数是long类型,另一个操作数就会转换成long类型
  • 否则,两个操作数都将被转换成int类型

2.2 强制类型转换

上节可以看出,在一些场景,可以进行自动类型转换,比如int类型可以自动转换成float类型。但是在开发中,有时候也需要将float类型转换成int类型,根据上述转换规则,这个转换是不能自动完成的。在Java中允许这种类型的转换,但是,有可能回损失一些精度信息。这种情况下,需要通过强制类型转换实现这个操作。比如:

double x = 9.997;
int nx = (int) x; //nx is 9

上述强制类型转换截断了double的小数部分,转换为整形。

注意:

  • 如果视图将一个数值从一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。比如(byte)300的实际值为44。
  • boolean类型不能与任何类型进行强制类型转换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值