2017-11-23 8 views
4

私は気づいた、興味深いものが1つあります。
JavaのInteger.MAX_VALUEある0x7fffffff(2147483647)
KotlinのInt.MAX_VALUE2147483647
ですが、あなたはJavaで
書く場合:Kotlinで
int value = 0xFFFFFFFF; //everything is fine (but printed value is '-1')

val value: Int = 0xFFFFFFFF //You get exception The integer literal does not conform to the expected type IntJava Integer.MAX_VALUEとKotlin Int.MAX_VALUE

興味深い権利を?だから、あなたはJavaでnew java.awt.Color(0xFFFFFFFF, true)のようなことをすることができますが、ではなく、でKotlinを実行できます。

Colorクラスはそのintを「バイナリ」レベルで処理するので、すべてのコンストラクタ(Color(int rgba)またはColor(int r, int g, int b, int a))を持つ両方のプラットフォームですべて正常に動作します。
kotlinで見つかった回避策はjava.awt.Color(0xFFFFFFFF.toInt(), true)です。

なぜ、Kotlinではこれがこのようなのでしょうか?

+1

私はJavaが自動的に数を「Int」から「Long」に広げると思います。 --- https://kotlinlang.org/docs/reference/basic-types.htmlを参照してください。またhttp://www.java2s.com/Tutorial/SCJP/0080__Type-Casting/WideningandNarrowconversions.htmも参照してください。 - Kotlinでは、あまりにも狭いタイプを選んだことからあなたを救うために、言語自動化は明示的に行う必要があります。 –

+2

@Mörre '0xFFFFFFFF'は' int'として '-1'の有効な2の補数表現です。 2つの言語の違いは、Kotlinのリテラルが2の補数表記を受け入れるように見えないことです。リテラル '0x80000000'はエラーです(Javaでは' Integer.MIN_VALUE'です)。言い換えれば、負のリテラルを表すには、単項 '--'演算子を使用する必要があります。私はどちらの言語の仕様でもこれについて具体的に言及することはできませんが。 – bcsb1001

+0

@ bcsb1001 'Integer.MAX_VALUE'をご覧ください –

答えて

5

これは、部分的にhereに答えている:

Kotlinで

あなたはJavaで真実ではない負のIntを示すために-符号を付加する必要があります。

したがって、Javaでは、16進リテラルはsignedと解釈されますが、Kotlinはそれらをunsignedとして扱います。

否定は手動で行う必要があります。

小はさておき:JetBrainsのKotlinコンバータは、実際に

var a = -0x1 

int a = 0xffffffff; 

を変換しますが、これはちょうどそれはあなたが気づいているかを正確に実現することができます。


This particular part of the spec (overflow behavior) for hexadecimal literalsはいえ、TODOとしてマークされ、これは公式の仕様は(まだ)このためにありませんされています。

0

説明はreference docsである:

により異なる表現に、小さいタイプは 大きなもののサブタイプではありません。彼らがいた場合、我々は以下の 一種の悩みだろう:

// Hypothetical code, does not actually compile: 
val a: Int? = 1 // A boxed Int (java.lang.Integer) 
val b: Long? = a // implicit conversion yields a boxed Long (java.lang.Long) 
print(a == b) // Surprise! This prints "false" as Long's equals() 
       // check for other part to be Long as well 

そうではないだけのアイデンティティを、それでも平等は、あらゆる場所に静かに を失われていたであろう。

結果として、より小さい型は暗黙的に大きな 型に変換されません。これは、明示的な変換を行わずにByte型の値をInt 変数に代入することができないことを意味します。

+1

これは問題ではありません。 Javaでは、 '0xFFFFFFFF'は' int'です。さらに、 'int'は' long'よりも絶対に大きくはありません – Moira

+1

本当ですか?本気ですか? https://stackoverflow.com/a/4355745/3195526 –

+0

はい、私は確信しています。 '0xFFFFFFFF'は、符号付きと解釈されたときに明らかに' -1'(32ビット)です。 – Moira

関連する問題