同じ明示的な型変換を適用しているため、次のコードの両方で出力が異なるのはなぜですか。
int hex = (char)0xA;
System.out.println(hex);
int hex = 0xA;
System.out.println((char)hex);
同じ明示的な型変換を適用しているため、次のコードの両方で出力が異なるのはなぜですか。
int hex = (char)0xA;
System.out.println(hex);
int hex = 0xA;
System.out.println((char)hex);
最初の行int
で、関数に値を送信しprintln
ます。2番目に値を送信 char
するため、違いが..
System.out.println(char x)の次 のオーバーロードと、System.out.println(int x)のオーバーロードを検討してください。
@Mortalusが答えたように、違いの理由は、ある場合にはintをprintlnに渡し、別の場合にはcharを渡したためです。
最初のケースでは、int ではなく char を作成しようとしていたが、構文が間違っていたことがわかります。それ以外の:
int hex = (char)0xA;
使用する
char hex = 0xA;
上記の最初のステートメントでは、リテラル 0xA は 10 進数値 10 の int リテラルです。次に、値 10 の char に明示的にキャストします。最後に、char を int 変数 hex に割り当てます。10 は int と char の両方に有効であるため、暗黙的な変換が実行され、char は int に変換され、char 変数ではなく int 変数になります。
上記の 2 番目のステートメントでは、同じリテラル値があり、それを char に割り当てています。暗黙的な変換が実行され、値が 10 の char 変数 16 進値があります。
例に対応する変更を加えると、両方が同じ結果を出力することがわかります。
char hex = 0xA;
System.out.println(hex);
int hex = 0xA;
System.out.println((char)hex);
[アップデート]
いずれの場合も、値が 10 の文字が出力されます。これは、事実上すべてのシステムで改行として解釈され、その後にシステム定義の行区切りシーケンスが続きます (println は行区切りを出力に追加することを保証するため)。
Windows では、行は通常 CR LF (13 の後に 10) で区切られますが、Linux/Mac システムでは行は通常 LF (10) で区切られます。
したがって、Windows では、両方のステートメントの結果は 3 バイト (10、13、10) になります。Linux/Mac では、両方のステートメントが 2 バイト (10, 10) になります。
いずれにせよ、出力は 2 行の空白行のように見えます。Linux/Mac では問題なく表示されますが、無効な行区切りを送信しているため、Windows では奇妙に見える場合があります。
ところで - ライン フィードを生成するために上記のコードを実際に使用することはお勧めしません。代わりに、システム プロパティ line.separator を使用し、代わりにその文字列を使用する必要があります。
String newLine = System.getProperty("line.separator").toString();