Java 类型转换与文字赋值
考虑以下几点:Java 类型转换与文字赋值,java,casting,Java,Casting,考虑以下几点: class TypeCast { public static void main(String[] args) { byte by = 4; // Compiler casts int literal to byte int in = 4; byte byt = in; // Compilation Error: compiler can not cast automatically. WHY? } } 我知道
class TypeCast {
public static void main(String[] args) {
byte by = 4; // Compiler casts int literal to byte
int in = 4;
byte byt = in; // Compilation Error: compiler can not cast automatically. WHY?
}
}
我知道编译器可以在文本赋值的情况下进行缩小。但当赋值涉及变量而不是文字时,它不能做同样的事情。为什么?
编辑:我想大多数人都不明白我想问什么。这不是关于分配“超出范围”的值,而是关于将“超出范围”的值分配给字节,并让编译器负责缩小范围。很明显,“byte”无法处理超出范围的值,需要显式转换(我不想知道)
给定值落在byte
范围内,将int
文字赋值给byte
和将int
类型变量赋值给byte
之间有什么区别 byte by=4是一种特殊情况。没有“强制转换”的参与,例如只允许恰好在字节范围内的整数值-128到127
尝试使用超出此范围的值,您将得到相同的错误
byte small = -128; // <== OK
byte big = 127; // <== OK
byte tooSmall = -129; // <== error: Type mismatch: cannot convert from int to byte
byte tooBig = 128; // <== error: Type mismatch: cannot convert from int to byte
byte small=-128;// 主要原因,IMHO,是这样的代码(实际上不编译)
是危险的,因为可能会溢出(int1234
变成-46
字节)。但是,
byte byt = 4;
是安全的,因为非法(溢出)代码
byte byt = 1234; // doesn't compile
将导致编译时错误。但是,你可以坚持:
// I'm warned about the overflow, but do as I command...
byte byt = (byte) 1234; // -46
或
因为将int
赋值给字节通常没有意义;编译器应该在这种语句上失败
编译器接受将文字整数值赋值给字节变量的原因是,它可以(并且确实)在编译时验证该赋值,因此它是完全安全的,并且根本不需要任何类型的“强制转换”。如果赋值无效,编译器将失败:
bash$ qjava 'byte b = 128;'
...\QJava.java:4: error: incompatible types: possible lossy conversion from int to byte
byte b = 128;
^
1 error
因为在代码中可以更改变量的值。这就是为什么不允许将int变量分配给字节的原因,但如果将int变量声明为final,则允许尝试以下操作:
public class Test {
public static void main(String[] args) {
final int i = 10;
byte by = i;
}
}
这意味着10在字节范围内,所以一切都很好,但如果您写入
public class Test {
public static void main(String[] args) {
final int i = 10000;
byte by = i;
}
}
它将给您一个错误,因为10000不在一个字节的范围内。如果C#包含一个字节文字类型,并且定义了布尔运算符(byte | byte),(byte^ byte),(byte&Int64),(Int64&byte),(byte&UInt64)和(UInt64&byte),在给定指定的操作数时,您的字节只能表示-128,然后,该语言可以合理地要求要将内容存储到字节中的代码应该使用字节类型的表达式。然而,该语言的创建者可能认为,为小于Int32
的类型添加真正支持的好处不足以证明成本的合理性,因此它只有极少数类型的表达式可以产生小于Int32
的值
考虑到将文字值赋值给短变量是非常常见的事实,因为C没有其他合理的方法来处理这些事情,该语言允许将0到255范围内的整数常量隐式转换为字节
。在类型系统设计中没有任何东西会暗示这种行为——在处理最常见的情况时,如果没有适当的字节类型支持,就会造成很大的麻烦,这基本上是一个难题。引用try do by=1000的可能重复项,您将得到相同的错误。文字/非文字与iTunes理解无关,允许将整数文字(名义上定义为32位)分配给更窄的数据类型,而编译器可以将文字视为与目标数据类型一样“窄”,这对程序员和编译器来说只是一种方便(因为编译器不必为short
、byte
和char
)提供文字十进制形式。“为什么?”没有什么神奇的原因。有些语言总是允许隐式缩小转换(例如C++)。Java不允许。“这不是关于分配“超出范围”的值。”是的,是的,因为这就是为什么它是不被允许的。如果你认为你的问题不同,那么我们就不能告诉你你在问什么。(例如,你是想问为什么编译器不能告诉你,
中的是4…?)
public class Test {
public static void main(String[] args) {
final int i = 10;
byte by = i;
}
}
public class Test {
public static void main(String[] args) {
final int i = 10000;
byte by = i;
}
}