- ベストアンサー
javaでunsignedは使えないのですか?
Eclipseを使い始めた初心者です。 short型変数を符号無しで宣言しようと思ったのですが、 赤の下線が出てしまってエラーの扱いになってしまっています。 javaではunsignedは使えないのでしょうか? 使えないのであれば、その理由と対処策を教えていただけましたら嬉しいです。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
unsigned short などのような構文はありませんが、とりあえず負の値を使いたくないのなら char型を数値のように使えばよろしいかと思います。 char型のとりうる範囲は0~65535で、範囲外の数値はint型とみなされます(数値を直接代入する場合のみ)。 ただし負のintをcharにキャストすると上位ビットが欠落します。 char c; c = 0; c = 65535; c = 65536; ←コンパイルエラー c = -1; ←コンパイルエラー c = (char)-1; ←コンパイルエラーにはならないが65535になる
その他の回答 (3)
- PED02744
- ベストアンサー率40% (157/390)
げ。。MAX 255って書いてるし。。。Orz 今まで私が作った過去のソースをあさってみたら、 基本的にはint で 0 から 65535 を使うようにしてあるんですが、 処理中で、0なら-32768 として処理する(32768のゲタをはかせる)ようにしたものもありました。 独自にUnsignedShortクラスを作ってますね。 きっと、最初の頃のソースなので、いろいろやってみたかったんでしょう(笑)<他人事か
お礼
>独自にUnsignedShortクラスを作ってますね。 別途にクラスを作るとは考えもしていなかったので眼からウロコでした。 そこまで今回は手間をかけたくない部分でしたので今後の参考にさせていただきます。 ご回答ありがとうございました。
- sha-girl
- ベストアンサー率52% (430/816)
signedとunsignedの比較はバグを生む原因になりますし 例えばキャストについても unsigned short a = 65535; short b = (short)a; これをC/C++言語でやると普通bが-1になりますが、 2の補数とビットについて理解していなければ 何故そうなるのかわからないでしょう。 Javaはそもそもプラットフォーム間の差を無くす事と 複雑なC++を簡素化する事が設計の思想になっていたと思います。 処理系が必ず2の補数を使っているとも限らないわけですから unsignedを認めない設計になったのだと思います。 (認めると処理系が変わる事で結果が変わる可能性がでてくるので。) 既にある回答と被りますが shortではなくintを使い 0~65535であることをチェックするしかないでしょう。
お礼
Javaの設計思想からご丁寧に教えてくださってありがとうございました。 ビットについては少し学んだのでbが-1になることは理解できました。 マイナスの値を取りたくなかっただけなのでチェックをするようにしてみます。 ありがとうございました。
- PED02744
- ベストアンサー率40% (157/390)
JAVAにはunsignedはありません。 理由は言語仕様だからとしか答えようがありませんが、 「数値型は符号を持つ事が義務付けられている」からです。 義務付けられているので根本的な対策はありません。 int型を使って、MIN=0 MAX=255 と決めてその範囲であることをチェックするしか方法はないと思います。
お礼
言語仕様として飲み込むのが正解なんですね。 使えないことがはっきりしてスッキリしました。 ご回答ありがとうございました。
お礼
対策方法を教えてくださってありがとうございました。 char型を使うのは全く考えていなかったのでとても参考になりました。 おかげで無事解決できました。 ありがとうございました。