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

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

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

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

Q&A

解決済

3回答

551閲覧

32bit符号付整数で(-2³¹)-(2³¹-1)=1となるのはなぜ?

ruei

総合スコア284

Java

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

0グッド

0クリップ

投稿2020/03/20 17:56

編集2020/03/22 15:50

32bit符号付整数で(-2³¹)-(2³¹-1)=1となるのはなぜでしょうか?
下のプログラムを動かすと、(-2³¹)-(2³¹-1)の結果、1が出力されます。

Java

1System.out.println(Integer.MIN_VALUE-Integer.MAX_VALUE);

正しい計算結果だと-2³²-1ですから-2³²が失われてしまっています。
なぜでしょうか。

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

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

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

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

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

guest

回答3

0

タイトルが間違っています。
「32bit符号付整数で(-2^31)-(2^31-1)=1となるのはなぜ?」ではなく
「32bit符号付整数でInteger.MIN_VALUE-Integer.MAX_VALUE=1となるのはなぜ?」
にするべきでしょう。

整数の演算子 ^ は排他的論理和(Exclusive OR) です。

Java

1class A { 2 public static void main(String[] args) { 3 System.out.println(Integer.MIN_VALUE-Integer.MAX_VALUE); 4 System.out.println((-(2<<31))-((2<<31)-1)); 5 System.out.println((-(2^31))-((2^31)-1)); 6 System.out.println(((-2)^31)-(2^(31-1))); 7 System.out.println((-2^31)-(2^31-1)); 8 } 9}

実行結果

1 1 -57 -59 -59

単項演算子 - は、2項演算子 ^ より優先順位が高い。
2項演算子 - は、2項演算子 ^ より優先順位が高い。

投稿2020/03/22 00:14

kazuma-s

総合スコア8224

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

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

ruei

2020/03/22 14:25 編集

^がべき乗かxorかというのは質問内容からもタイトルからも分かると思います。
y_waiwai

2020/03/22 14:40

ならJAVAのタグつけんな、というはなしになろうかとw
ruei

2020/03/22 15:21

Javaで起きた問題なのでJavaのタグは付けたいです。 本当に誤解されたんですか? そうであれば、今後は2³¹とかInteger.MIN_VALUE-Integer.MAX_VALUEに改めるようにします。
guest

0

16ビットとして演算

(-2^31)
11111111 11111110 ^ 00000000 00011111 → 11111111 11100001
(2^31)
00000000 00000010 ^ 00000000 00011111 → 00000000 00011101
-1 すると、
00000000 00011100
マイナスすれば、
11111111 11000101

あれ?

ああ、- のほうが優先順位高いから、
(2^30)
00000000 00000010 ^ 00000000 00011110 → 00000000 00011100

マイナスすれば、
11111111 11000101

うーむ

投稿2020/03/20 23:36

編集2020/03/20 23:53
y_waiwai

総合スコア87800

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

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

ruei

2020/03/22 14:25

わざと誤読した回答を送ってこられると意図が分からないので困ります。
guest

0

ベストアンサー

2^32は2進数で1の下に0が32個付く数になります。
32bit整数では下位32bitのみ残り、「0」と等しくなります。
マイナス演算は全bit反転して1を加え、結局0になります。
つまり-2^32+1は32bit整数では1と同じになります。

※(-2^31)-(2^31-1)=-2^32+1です。

投稿2020/03/20 18:18

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問