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

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

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

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

Q&A

解決済

1回答

2287閲覧

byte型で「0b1000_0000」がコンパイルエラーになる理由に関しまして。

a2606

総合スコア22

Java

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

0グッド

0クリップ

投稿2018/02/10 07:16

今週からJava Silverの取得に向けて、勉強を始めたのですが、
下記の表記ではコンパイルエラーになるという問題がありました。

java

1byte b = 0b1000_0000;

2進数で「10000000」は「-128」である為、byte型の範囲内であるように思えます。
バイナリリテラルでは最上位ビットは符号として扱われないという認識でよろしいのでしょうか?
恐れ入りますが、ご教示頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

2進数で「10000000」は「-128」である為

いえ、それは128を意味します。10000000が-128を意味するためにはその二進数が「8bitの符号付き」という前提が必要ですが、Javaの整数リテラルにはそういう前提はありません。

0b...とか0x...というのは結局のところ「intのリテラル表現の一つ」なので「32bitの符号付整数として解釈される」のです。

そういう意味で
short s = 0b1000_0000_0000_0000;
も同様にNGになります。

しかし「32bitの符号付整数の表現である」という前提があるため

int i = 0b10000000_00000000_00000000_00000000;

と書くと右辺は負の数として解釈されこの行は正当と見做されます。

「だったら
byte b = 0b1000_0000B;
みたいな表現を許してくれればいいのに!」

と思われるかも知れません。それはそうかも知れないのですが残念ながらJavaにはそういう表現法はサポートされてません・・・

投稿2018/02/10 07:45

KSwordOfHaste

総合スコア18394

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

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

a2606

2018/02/10 09:45

ご回答ありがとうございます。 接尾辞の「L」や「F」とは異なり、あくまでデータ型は「int型」のままだったのですね! int型リテラル(32bitの符号付き整数)ということを踏まえ、下記のように指定することで期待通りの結果を得ることができました。 ```java byte b = 0b11111111_11111111_11111111_10000000; // -128 ```
KSwordOfHaste

2018/02/10 10:49

うーんbyte b = (byte)0b1000_0000;ぐらいでもいいのではないでしょうか。 キャストいやだ!と思われるかも知れませんが、byteが8bitであることは明らかなのでキャストによって本来意図した以外の値になる心配はないですよね。(なぜキャストしなきゃいけないんだと違和感を感じる向きは多いと思いますが、javaにunsignedがないので自分は必要悪と割り切ってしまいます) またプログラマーは二進数、十進数、16進数に慣れてしまうので byte b = -128; byte b = (byte)0x80; でもそれほど混乱することもないという話もあるかも。
a2606

2018/02/10 15:26

ご返信ありがとうございます。 先程のコメントでの指定の仕方は、「32ビットの符号付き整数」ということを教えていただけたので、上 位3バイトは自動的に0で補完されていると考えて、その箇所を1で指定すれば「-128」になることを確認するために行いました。 特にキャスト変換に抵抗はないので、もし2進数表記で初期化する場合は、私もキャスト変換を行ったほうが良いと思います。
KSwordOfHaste

2018/02/10 15:29

なるほどそういうことでしたか。なんだか蛇足なコメントしてしまいました。失礼しました。
a2606

2018/02/11 05:23

いえいえ、とんでもないです。 親身になって補足していただけるのは非常にありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問