Javaでコンパイラが自動的に行う強制タイプ変換について

4218 ワード

タイプ変換について
一般的な法則:小さいタイプから大きいタイプへは自動的にタイプ変換できますが、大きいタイプから小さいタイプへは手動で強制的なタイプ変換が必要です.
注意:1.タイプのサイズはバイトサイズではなく、その範囲によって決まります.たとえば、
        long long1 = 300F;//  ,      

        float float1 = 300L;//      ,        

longは8バイト、floatは4バイトですが、実際にはfloatが表す範囲はlongよりも大きく、(これは主に下位層が記憶方式の違いによるものである)従ってlongタイプの定数はfloatタイプの変数に割り当てることができ、逆にだめである.2.この規則は参照データタイプにも用いることができ、参照タイプであれば、タイプのサイズは彼らの継承または実現関係によって決定される.
自動javaでのコンパイラによる自動強制タイプ変換について
        byte byte1 = 1;
        short short1 = 2;
        char char1 = 3;

上のコードのように、みんなが書いたと信じていますが、実際には、コンパイルも通過し、正常に動作します.しかし、初心者としては、疑問を抱くべきではないでしょうか.JAvaの整数定数はintタイプで、intタイプの定数をbyte、short、charタイプの変数に割り当てますが、エラーは発生しませんか?小さいタイプでなければ自動タイプ変換を大きなタイプに変えることはできませんか?大タイプの回転小タイプは強制タイプ変換が必要であり、精度が損なわれる可能性があります.ここはなぜですか.
実はjavaにはintタイプの定数がbyte、short、charタイプの範囲などであればbyte、short、charの変数に直接割り当てることができ、検査作業はjavaのコンパイラが自動的に行うメカニズムがあります.
注意:1.定数のみで、変数または変数が演算に関与する式ではありません.
        byte byte1 = 1;
        short short1 = 2;
        char char1 = 3;
        int int1 = 3short short2 = byte1 + 1;//  ,      
        short short3 = int1;//  ,      
        short short4 = 3;//    ,        

Javaコンパイラは、変数の値や変数が関与する演算結果を検出することなく、字面定数がタイプの範囲を超えているかどうかを自動的に検出するだけです.“short short2 = byte1 + 1;”演算を行うと、自動的にintタイプに上昇し、コンパイラは結果がintタイプの値であり、前の変数がshortタイプであることを検出します.小さいタイプから大きいタイプに変わるわけではないので、直接コンパイルしてエラーを報告します.“short short3 = int1;” 変数のタイプを直接通過すると問題があり、コンテキストで値が範囲を超えているかどうかを判断することはありません.
2.定数の式でも可能
	short short4 = 1 + 2;//    ,        

簡単な定数式のため、javaのコンパイラは直接結果を演算し、範囲を超えているかどうかをさらに検出することができます.
3.このメカニズムはint回転byte、short、charのみ
        float float1 = 3.14;//  ,      

他の基本データ型や参照データ型については,このメカニズムはなく,冒頭で述べた一般的な法則しか使用できない.他の簡単なテスト、例えば範囲を超えるとコンパイルが間違っています.他の2つのタイプbyteとcharはコードを貼っていません.
分からないところや悪いところがあれば、伝言を残して交流を検討してください.