- ベストアンサー
符号付きにすべきか、符号なしにすべきか
変数の定義でとり得る値が1~100の場合の変数の定義は、 符号有り1バイトで定義する 符号無し1バイトで定義する どちらが、一般的なのでしょうか。 メモリをなるべく節約したいのですが、上記どちらも1バイトですし、1~100までなので符号ありでも定義して問題ないと思いますが、それ以外(処理速度等)で2つの定義の違いによるメリット/デメリット等はあるのでしょうか。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
静的な変数でなければint型にしましょう。 自動変数の場合、通常はレジスタに割り付けられますので、char型にするよりint型にする方が有利です。また、スタックに割り付けられる場合でも、境界調整の関係でint型と同じサイズが消費される場合が多く、また、char型やshort型にすると汎整数拡張の処理により多くのメモリ(プログラム)を割く結果になったりします。 処理速度に関しても、char型よりint型の方が、汎整数拡張やサイズの切捨てが不要な分、圧倒的に有利です。
その他の回答 (6)
- matyrcry
- ベストアンサー率47% (101/213)
配列のインデックスなどに使うなら符号なし、加減算の対象にとるなら 符号ありのほうがいと思います。 自分の場合は処理ミスで範囲外の値をとったときの振る舞いで決めます。 範囲チェックをコーディングするなら、符号なしの0~99にしたほう が比較処理が軽くなるかも。
お礼
ありがとうございます。
- VirtualT2
- ベストアンサー率58% (18/31)
こにゃちわ。 プラットフォームに依存すると思いますです。 一般的にはunsignedだと当方はおもっちょります。 符号化するに当たってのメリットは、 「マイナス値をエラー値として扱える。」 くらいかな? デメリットは、 「CPU/MPUで些細な速度低下があるかもしれない」 プラットフォームによりますね。 signed/unsignedを切り替えての1000回実行で ベンチを取ってみるのも一興かと。 またバイト単位での速度低下も懸念してみます。 CPUが奇数アドレスへのアクセスを推奨しない場合とかあったりします。 (組み込み系とかで、日立のSH系とか…大半のRISC系でバスエラー アセンブルソースをみると、WORD単位でアクセスして 上位バイト・下位バイトの取り出しをやってたりする可能性とかありますです。 メモリは節約できますが、実行速度が微小ですが低下したりします。 しかしながら、uchar a[1000]; と ushort a[1000]; とuint a[1000]; とかで考えると…。普通にucharになるかと。
お礼
なるほどです。 ありがとうございます。
- rot-N
- ベストアンサー率27% (118/432)
そこまで逝って(^^;)しまったのなら、簡単なプログラムを書いて、逆アセンブルして、その効率を見て決めるべきでしょうね。 思いっきり処理系依存なので、これ以上は回答しません。 私は、他人がソースを読むことを考えた場合、signedもunsignedも付けません。(ソースを読む人に、「何故signedなのか」とか「何故unsignedなのか」を考えさせないために) で、プログラムのアタマに、この変数は、1から100までの値しか取りませんとコメントを記載します。ソースを読む人にとっては、そちらの方が大事なのだろうと思いますが、如何?
お礼
ありがとうございます。 コメントで明確にしたほうが、より親切ですね。
- tonakamu
- ベストアンサー率0% (0/1)
符号の有無で、処理速度に差は無かったと思います。 (何億回と繰り返せば、差が出てくる場合もあるかもしれませんが・・・) 『符号有り』で宣言した方が良いと思われます。 尚、私の場合は、特別な理由がないかぎり、符号有りの宣言(”singed”)は、使用していません。
お礼
ありがとうございます。
- TALLY-HO
- ベストアンサー率29% (103/354)
処理速度には大差なかったと思います。 特に理由がないのなら、signed(符号あり)にしておきましょう。 理由として、質問者さんが意図している値が1~100であっても システムが負数を扱う場合があるからです。unsignedで if( character == EOF ) なんていう比較をうっかりしてしまうと想定外の動作をしますし。
お礼
EOFとの比較ですか。 ありがとうございます。
- mendokusa
- ベストアンサー率13% (359/2726)
符号無しの方が単純でいいんじゃないですか。
お礼
単純にそうかもしれません。 ありがとうございます。
お礼
なるほど、自動変数なら通常はレジスタに割り当てられますね。 ありがとうございます。