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

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

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

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

Q&A

解決済

5回答

1598閲覧

データ型のbyteの範囲

shichihukujin

総合スコア18

Java

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

0グッド

0クリップ

投稿2016/09/08 06:11

編集2016/09/09 15:45

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

数値のデータ型について質問です。 例えば1byteは1バイトに相当して、対応できる範囲は-128~127と記載されていました。 僕は1byteは00000000となっていて八桁目でプラスかマイナスを出力し、残りの七桁以下で数値の大きさを決定していると考えてしまいました。しかし、そうすると数字の範囲は-127~127が妥当だと思いました。 質問は、何故-127ではなく-128なのでしょうか。教えてください。

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答5

0

ベストアンサー

Javaを含め、多くのプログラミング言語では、負の整数について2の補数表現をとっています。これは、正の数のビットを反転させて、1を足したものです。

  • 127…0111 1111
  • (中略)
  • 1…0000 0001
  • 0…0000 0000
  • -1…1111 1111
  • -2…1111 1110
  • (中略)
  • -128…1000 0000

この「2の補数表現」を取ることのメリットとしては、

  • ゼロの表現が1通りしかない(一方で、浮動小数点数として一般的なIEEE 754には、「-0」なる数が存在します)
  • 負の数と正の数の足し算がそのままできる

などがあります。負の数では0がないので、正の数より1つ絶対値が大きいところまで取れます。

投稿2016/09/08 06:21

maisumakun

総合スコア145183

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

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

0

「1の補数表現」というビット表現手法のせいでそうなるのですが、ごく簡単な理解としては
-127~127 を表現することにしようとすると
同じゼロを意味する-0,+0という2種類の表現方法が出てきてしまいます。

投稿2016/09/08 06:17

yuba

総合スコア5568

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

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

yuba

2016/09/08 07:20

「2の補数」だった⋯
shichihukujin

2016/09/08 09:37

確かに、0を意味したいのに-0と+0が区別されるのはどこかで支障をきたしそうですね。ありがとうございました。
guest

0

1ビットだけで表せるのは 0, 1 の2つです。 2の補数表現では それぞれに数値の 0, -1 を割り当てます。
2ビットで表せるのは、 00, 01, 10, 11 です。 それぞれに数値の 0, 1, -2, -1 を割り当てます。
3ビットで表せるのは、 000, 001, 010, 011, 100, 101, 110, 111 です。
それぞれに数値の 0, 1, 2, 3, -4, -3, -2, -1 を割り当てます。

8 ビット (1byte) で表せるのは 00000000, 00000001, ..., 01111111, 10000000, ... 11111111 です。
それぞれに数値の 0, 1, ..., 127, -128, ..., -1 を割り当てます。

n ビットで表せる数の種類は、偶数個あります。
(1, -1), (2, -2) ... と組み合わせていけば、これらの個数の合計は偶数個になります。
これに 0 を加えると奇数個になってしまいます。
では 0と対にするのを, 正の数にするか、不の数の方にするか? あるいは、0 の対は 0として、2つのビット表現を割り当てるか?
2の補数表現では、 負の数の方を選んでいるということです。

0 の対に当たるものは無しとする選択肢もありえますね。
なぜ無効とせずに、負の数の方の値を選んだか? 正の数を選ばなかったのはなぜか?, 0 に2つの表現を与えなかったのはなぜか?
その理由をいろいろ考えてみると面白いかもしれません。

情報を保持するのに ビットの状態 [0, 1] の2通りを基本にしているから上のようなことになります。

もし、情報をコマの回転 [無し、右回り、左回り] のような 3つの状態を基本にしたとしたら、
数値の割り当ては、どんな風になるべきでしょうか

投稿2016/09/10 01:11

katoy

総合スコア22324

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

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

0

簡単に言うとマイナス方向に0はいらないからですね

投稿2016/09/08 06:23

abs123

総合スコア1280

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

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

shichihukujin

2016/09/08 09:33

最初はこの回答の意味が分かりませんでしたが、maisumakunさんの説明により理解することが出来ました。ありがとうございます。
guest

0

八桁目と七桁目でプラスかマイナスを出力し

符号は8桁目だけです。

投稿2016/09/08 06:18

ozwk

総合スコア13521

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

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

shichihukujin

2016/09/08 09:34

最初はこの回答の意味が分かりませんでしたが、maisumakunさんの説明により理解することが出来ました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問