java-Cast造型运算符

“造型”( Cast)的作用是“与一个模型匹配”。在适当的时候, Java 会将一种数据类型自动转换成另一
种。例如,假设我们为浮点变量分配一个整数值,计算机会将 int 自动转换成 float。通过造型,我们可明
确设置这种类型的转换,或者在一般没有可能进行的时候强迫它进行。

为进行一次造型,要将括号中希望的数据类型(包括所有修改符)置于其他任何值的左侧

void casts() {
int i = 200;
long l = (long)i;
long l2 = (long)200;
}

在这儿展示的两种情况下,造型均是多余的,因为编译器在必要的时候会自动进行 int 值到 long 值的转换。

在 C 和 C++中,造型有时会让人头痛。在 Java 里,造型则是一种比较安全的操作。

Narrowing Conversion
进行一种名为“缩小转换”( Narrowing Conversion)的操作(也就是说,脚本是能容纳更多信息的数据类型,将其转换成容量较小的类型),此时就可能面临信息丢失的危险。此时,编译器会强迫我们进行造型

Widening conversion
对于“放大转换”( Widening conversion),则不必进行明确造型,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失。

Java 允许我们将任何主类型“造型”为其他任何一种主类型,但布尔值( bollean)要除外,后者根本不允
许进行任何造型处理,为了将一种类转换成另一种,必须采用特殊的方法

字面值
最开始的时候,若在一个程序里插入“字面值”( Literal),编译器通常能准确知道要生成什么样的类型。
但在有些时候,对于类型却是暧昧不清的。若发生这种情况,必须对编译器加以适当的“指导”。方法是用
与字面值关联的字符形式加入一些额外的信息。下面这段代码向大家展示了这些字符。

public class Literals {
    char c = 0xffff; // max char hex value
    byte b = 0x7f; // max byte hex value
    short s = 0x7fff; // max short hex value
    int i1 = 0x2f; // Hexadecimal (lowercase)
    int i2 = 0X2F; // Hexadecimal (uppercase)
    int i3 = 0177; // Octal (leading zero)
    // Hex and Oct also work with long.
    long n1 = 200L; // long suffix
    long n2 = 200l; // long suffix
    long n3 = 200;
    //! long l6(200); // not allowed
    float f1 = 1;
    float f2 = 1F; // float suffix
    float f3 = 1f; // float suffix
    float f4 = 1e-45f; // 10 to the power
    float f5 = 1e+9f; // float suffix
    double d1 = 1d; // double suffix
    double d2 = 1D; // double suffix
    double d3 = 47e47d; // 10 to the power
} ///

十六进制( Base 16) —— 它适用于所有整数数据类型—— 用一个前置的 0x 或 0X 指示。并在后面跟随采用大写或小写形式的 0-9 以及 a-f。若试图将一个变量初始化成超出自身能力的一个值(无论这个值的数值形式如何),编译器就会向我们报告一条出错消息。注意在上述代码中,最大的十六进制值只会在char, byte 以及 short 身上出现。若超出这一限制,编译器会将值自动变成一个 int,并告诉我们需要对这一次赋值进行“缩小造型”

八进制( Base 8)是用数字中的一个前置 0 以及 0-7 的数位指示的。在 C, C++或者 Java 中,对二进制数字没有相应的“字面”表示方法。
字面值后的尾随字符标志着它的类型。若为大写或小写的 L,代表 long;大写或小写的 F,代表 float;大写或小写的 D,则代表 double。

指数总是采用一种我们认为很不直观的记号方法: 1.39e-47f。在科学与工程学领域,“ e”代表自然对数的
基数,约等于 2.718( Java 一种更精确的 double 值采用 Math.E 的形式)。它在象“ 1.39 × e 的-47 次方”这
样的指数表达式中使用,意味着“ 1.39× 2.718 的-47 次方”。然而,自 FORTRAN 语言发明后,人们自然而然
地觉得 e 代表“ 10 多少次幂”。这种做法显得颇为古怪,因为 FORTRAN 最初面向的是科学与工程设计领域。
理所当然,它的设计者应对这样的混淆概念持谨慎态度(注释①)。但不管怎样,这种特别的表达方法在
C, C++以及现在的 Java 中顽固地保留下来了。所以倘若您习惯将 e 作为自然对数的基数使用,那么在 Java
中看到象“ 1.39e-47f”这样的表达式时,请转换您的思维,从程序设计的角度思考它;它真正的含义是
“ 1.39× 10 的-47 次方”。

注意如果编译器能够正确地识别类型,就不必使用尾随字符。对于下述语句:
long n3 = 200;它并不存在含混不清的地方,所以 200 后面的一个 L 大可省去。然而,对于下述语句:
float f4 = 1e-47f; //10 的幂数编译器通常会将指数作为双精度数( double)处理,所以假如没有这个尾随的 f,就会收到一条出错提示,告诉我们须用一个“造型”将 double 转换成 float。

2、转型
大家会发现假若对主数据类型执行任何算术或按位运算,只要它们“比int 小”(即 char, byte 或者
short),那么在正式执行运算之前,那些值会自动转换成int。这样一来,最终生成的值就是 int 类型。所
以只要把一个值赋回较小的类型,就必须使用“造型”。此外,由于是将值赋回给较小的类型,所以可能出
现信息丢失的情况)。通常,表达式中最大的数据类型是决定了表达式最终结果大小的那个类型。若将一个float 值与一个 double 值相乘,结果就是 double;如将一个 int 和一个 long 值相加,则结果为 long

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值