質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

2340閲覧

java long型の演算についてです。

dorakensan

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/09/19 07:53

以下の処理結果が同じにならない理由がわかりません。ご教授願えますでしょうか。

該当のソースコード

java

1 long a = 2500 * 2500* 2500; 2 System.out.println(a);

結果

-1554869184

java

1 long a = 2500 * 2500; 2 a = a * 2500; 3 System.out.println(a);

結果

15625000000

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

処理結果が同じにならない理由がわかりません。

理由としては「2500 * 2500 * 2500」の式は全てint型で計算され、左辺のlong型の変数に代入される前の段階でint型に切り詰められているから、です。

まず、「2500 * 2500 * 2500」と言う定数の計算はそのままではint型で計算されます。
2500 * 2500 * 2500の計算結果は10進数表記で15,625,000,000、16進数表記で0x3A3529440であり、Javaのint型32ビットの範囲を越えます。越えてしまった場合、上位桁(ビット)が切り捨てられますが、この場合は32ビットで0xA3529440になります。ここから左辺のlong型の変数に合わせてキャストされて代入されますが、0xA3529440の最上位ビットは1であり、負の値を示します。int型より大きいlong型にキャストされるとき、「符号拡張」という処置が施され、0xFFFFFFFA3529440になります。これは、long型でも負の値を示します。

2500L * 2500 * 2500と式を書けばその中で一番大きい型、long扱いの2500Lに合わせてlong型で計算されますし、(long)2500 * 2500 * 2500としても同じ結果になります。

イメージ説明

投稿2021/09/19 08:36

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dorakensan

2021/09/20 01:24

大変わかりやすい解説ありがとうございます。基礎をしっかり理解しなければいけないと気付きました。
guest

0

long a = 2500 * 2500* 2500;

2500という定数はint型ですね

投稿2021/09/19 07:56

編集2021/09/19 07:59
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dorakensan

2021/09/19 08:00

ありがとうございます。 -9223372036854775808~9223372036854775807の範囲ですので、問題なく演算できる想定ですが、上記ソースの結果(負の値)になってしまう理由がわからず質問させていただきました。
y_waiwai

2021/09/19 08:03

long a= 2500l * 2500* 2500; としてみよう #回答修正してます
dorakensan

2021/09/19 08:03

ありがとうございます。下記の内容に修正したところ想定通りの結果が得られました。 ``` long a = 2500L * 2500L* 2500L; ```
dorakensan

2021/09/19 08:08

回答いただいたとおり、一つだけLをつければ想定通りになることが確認できました。 ありがとうございます。
y_waiwai

2021/09/19 08:13

左から順に計算されていくんで、最初の数字をlong にしとけばそこからlongの演算になるんで結果は正しくなるけど、やっぱ、全部の数字にLをつけるって方が、まっとうなやりかたでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問