[解決済み] Javaがintをbyteに変換するときの奇妙な動作?
質問
int i =132;
byte b =(byte)i; System.out.println(b);
呆気ない。なぜ出力が
-124
?
どのように解決するのですか?
Javaでは
int
は32ビットです。A
byte
は8
bits
.
Javaではほとんどのプリミティブ型が符号付きであり
byte
,
short
,
int
そして
long
は2の補数で符号化されます。 (その
char
型は符号なしであり、符号の概念は
boolean
.)
この数値スキームでは、最上位ビットが数値の符号を指定します。より多くのビットが必要な場合、最上位ビット ("MSB") は単に新しい MSB にコピーされます。
ですから、もしあなたがバイト
255
:
11111111
と表現したい場合、それを
int
(32ビット)として表現したい場合は、単純に1を24回左にコピーします。
さて、負の 2 の補数を読む 1 つの方法は、最下位ビットから始めて、最初の 1 を見つけるまで左に移動し、その後のすべてのビットを反転させることです。その結果得られる数値は、その数値の正バージョンとなります。
たとえば
11111111
になります。
00000001
=
-1
. これがJavaが値として表示するものです。
おそらくあなたがしたいことは、バイトの符号なし値を知ることです。
最下位の8ビット以外を削除するビットマスクでこれを達成することができます。(0xff)
というわけで。
byte signedByte = -1;
int unsignedByte = signedByte & (0xff);
System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
印刷されるでしょう。
"Signed: -1 Unsigned: 255"
ここでは実際に何が起こっているのでしょうか?
余計な符号ビット(最下位8ビットの左側にある1)をすべてマスクするためにビット単位のANDを使用しています。 int がバイトに変換されるとき、Java は左から 24 ビットを切り落とします。
1111111111111111111111111010101
&
0000000000000000000000001111111
=
0000000000000000000000001010101
32ビット目が8ビット目ではなく符号ビットになっているため(そして符号ビットを正の値である0に設定している)、バイトの元の8ビットがJavaによって正の値として読み取られます。
関連
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] Javaでバイト配列から16進文字列に変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
java.util.NoSuchElementException 原因解析と解決方法
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res