运算符:3.1.13 造型运算符



“造型”(Cast)作用是“和个模型匹配”在适当时候Java会将种数据类型自动转换成另例如假设我们为浮点变量分配个整数值计算机会将自动转换成float通过造型我们可明确设置这种类型转换或者在般没有可能进行时候强迫它进行
为进行次造型要将括号中希望数据类型(包括所有修改符)置于其他任何值左侧下面是个例子:

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

正如您看到那样既可对个数值进行造型处理亦可对个变量进行造型处理但在这儿展示两种情况下造型均是多余编译器在必要时候会自动进行值到long值转换当然仍然可以设置个造型提醒自己留意也使更清楚在其他情况下造型只有在代码编译时才显出重要性
在C和C造型有时会让人头痛在Java里造型则是种比较安全操作但是若进行种名为“缩小转换”(Narrowing Conversion)操作(也就是说脚本是能容纳更多信息数据类型将其转换成容量较小类型)此时就可能面临信息丢失危险此时编译器会强迫我们进行造型就好象说:“这可能是件危险事情——如果您想让我不顾切地做那么对不起请明确造型”而对于“放大转换”(Widening conversion)则不必进行明确造型新类型肯定能容纳原来类型信息不会造成任何信息丢失
Java允许我们将任何主类型“造型”为其他任何种主类型但布尔值(bollean)要除外后者根本不允许进行任何造型处理“类”不允许进行造型为了将种类转换成另必须采用特殊思路方法(字串是种特殊情况本书后面会讲到将对象造型到个类型“家族”里;例如“橡树”可造型为“树”;反的亦然但对于其他外来类型如“岩石”则不能造型为“树”)

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

//: Literals.java Literals { char c = 0xffff; // max char hex value b = 0x7f; // max hex value s = 0x7fff; // max hex value i1 = 0x2f; // Hexadecimal (lower) i2 = 0X2F; // Hexadecimal (upper) 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 } ///:~




十 6进制(Base 16)——它适用于所有整数数据类型——用个前置0x或0X指示并在后面跟随采用大写或小写形式0-9以及a-f若试图将个变量化成超出自身能力个值(无论这个值数值形式如何)编译器就会向我们报告条出错消息注意在上述代码中最大十 6进制值只会在char以及身上出现若超出这限制编译器会将值自动变成并告诉我们需要对这次赋值进行“缩小造型”这样我们就可清楚获知自己已超载了边界
8进制(Base 8)是用数字中个前置0以及0-7数位指示在CC或者Java中对 2进制数字没有相应“字面”表示思路方法
字面值后尾随标志着它类型若为大写或小写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最初面向是科学和工程设计领域理所当然设计者应对这样混淆概念持谨慎态度(注释①)但不管怎样这种特别表达思路方法在CC以及现在Java中顽固地保留下来了所以倘若您习惯将e作为自然对数基数使用那么在Java中看到象“1.39e-47f”这样表达式时请转换您思维设计角度研究它;它真正含义是“1.39×10-47次方”

①:John Kirkham这样写道:“我最早于1962年在部IBM 1620机器上使用FORTRAN II那时——包括60年代以及70年代早期FORTRAN直都是使用大写字母的所以会出现这情况可能是由于早期输入设备大多是老式电传打字机使用5位Baudot码那种码并不具备小写能力乘幂表达式中‘E’也肯定是大写所以不会和自然对数基数‘e’发生冲突后者必然是小写‘E’这个字母含义其实很简单就是‘Exponential’意思即‘指数’或‘幂数’代表计算系统基数——般都是10当时 8进制也在员中广泛使用尽管我自己未看到它使用但假若我在乘幂表达式中看到个 8进制数字就会把它认作Base 8我记得第次看到用小写‘e’表示指数是在70年代末期我当时也觉得它极易产生混淆所以说这个问题完全是自己‘潜入’FORTRAN里去并非开始就有如果你真想使用自然对数基数实际有现成可供利用但它们都是大写

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

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

延伸阅读

最新评论

发表评论