プロが教える店舗&オフィスのセキュリティ対策術

Eclipseを使い始めた初心者です。
short型変数を符号無しで宣言しようと思ったのですが、
赤の下線が出てしまってエラーの扱いになってしまっています。

javaではunsignedは使えないのでしょうか?
使えないのであれば、その理由と対処策を教えていただけましたら嬉しいです。
宜しくお願い致します。

A 回答 (4件)

unsigned short などのような構文はありませんが、とりあえず負の値を使いたくないのなら char型を数値のように使えばよろしいかと思います。


char型のとりうる範囲は0~65535で、範囲外の数値はint型とみなされます(数値を直接代入する場合のみ)。
ただし負のintをcharにキャストすると上位ビットが欠落します。

char c;
c = 0;
c = 65535;
c = 65536; ←コンパイルエラー
c = -1; ←コンパイルエラー
c = (char)-1; ←コンパイルエラーにはならないが65535になる
    • good
    • 2
この回答へのお礼

対策方法を教えてくださってありがとうございました。
char型を使うのは全く考えていなかったのでとても参考になりました。
おかげで無事解決できました。
ありがとうございました。

お礼日時:2007/08/29 22:54

げ。

。MAX 255って書いてるし。。。Orz

今まで私が作った過去のソースをあさってみたら、
基本的にはint で 0 から 65535 を使うようにしてあるんですが、
処理中で、0なら-32768 として処理する(32768のゲタをはかせる)ようにしたものもありました。
独自にUnsignedShortクラスを作ってますね。
きっと、最初の頃のソースなので、いろいろやってみたかったんでしょう(笑)<他人事か
    • good
    • 1
この回答へのお礼

>独自にUnsignedShortクラスを作ってますね。
別途にクラスを作るとは考えもしていなかったので眼からウロコでした。
そこまで今回は手間をかけたくない部分でしたので今後の参考にさせていただきます。
ご回答ありがとうございました。

お礼日時:2007/08/29 22:48

signedとunsignedの比較はバグを生む原因になりますし


例えばキャストについても

unsigned short a = 65535;
short b = (short)a;

これをC/C++言語でやると普通bが-1になりますが、
2の補数とビットについて理解していなければ
何故そうなるのかわからないでしょう。
Javaはそもそもプラットフォーム間の差を無くす事と
複雑なC++を簡素化する事が設計の思想になっていたと思います。
処理系が必ず2の補数を使っているとも限らないわけですから
unsignedを認めない設計になったのだと思います。
(認めると処理系が変わる事で結果が変わる可能性がでてくるので。)

既にある回答と被りますが
shortではなくintを使い
0~65535であることをチェックするしかないでしょう。
    • good
    • 0
この回答へのお礼

Javaの設計思想からご丁寧に教えてくださってありがとうございました。
ビットについては少し学んだのでbが-1になることは理解できました。
マイナスの値を取りたくなかっただけなのでチェックをするようにしてみます。
ありがとうございました。

お礼日時:2007/08/29 22:31

JAVAにはunsignedはありません。


理由は言語仕様だからとしか答えようがありませんが、
「数値型は符号を持つ事が義務付けられている」からです。
義務付けられているので根本的な対策はありません。
int型を使って、MIN=0 MAX=255 と決めてその範囲であることをチェックするしか方法はないと思います。
    • good
    • 1
この回答へのお礼

言語仕様として飲み込むのが正解なんですね。
使えないことがはっきりしてスッキリしました。
ご回答ありがとうございました。

お礼日時:2007/08/29 22:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!