2017-10-28 1 views
0

に負Integer.MINの変換:上記のコード私はコードの下に使用して正のlong値に負のInteger.MINを変換しようとしています正長い

long lv = -1 * value_int; 

はvalue_int =はInteger.MIN_VALUEの際に値を除いて完璧に動作します。 Integer.MIN_VALUEの場合、lvの値は常にInteger.MIN_VALUEです。

はInteger.MIN_VALUE

long lv = value_int; 
lv = -1 * value_int; 

を含め、すべての場合において、コードワークの下

任意のアイデアなぜ長いLV = -1 * value_intははInteger.MIN_VALUEのケースでは動作しませんか?

+0

@Oleg C#の質問/答えです。この場合、問題は非常によく似ている可能性がありますが、それは良い複製ではありません。 –

+1

@ErwinBolwidtあなたはおそらく正しいでしょう。完璧にフィットしていないものの、https://stackoverflow.com/questions/24755629/int-to-long-assignmentも見つかりました。私はおそらく、私の時間を無駄にすることを止めるべきではありません。 – Oleg

答えて

6

1(この場合、単一-オペレータが先行する)は、intリテラルです。 value_intintであるため、乗算はintとして行われます。これはオーバーフローし、その後は長時間に昇格します。あなたの代わりにリテラルlongを使用している場合は、乗算が長いとして行われます、そして、あなたは正しい結果を取得したい:

long lv = -1L * value_int; 
// Here-----^ 
+2

これは非常に賢明な点ですが、JLS -1によれば、intリテラルではありません。これは、単項演算子が前に付いたintリテラル1です。 –

+1

ニースキャッチ@cppbeginner、ありがとう!それに応じて私の答えを編集しました。 – Mureinik

関連する問題