Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型转换与文字赋值_Java_Casting - Fatal编程技术网

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,是这样的代码(实际上不编译)

是危险的,因为可能会溢出(int
1234
变成
-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;
   }
 }