• ベストアンサー

符号付きにすべきか、符号なしにすべきか

VirtualT2の回答

  • VirtualT2
  • ベストアンサー率58% (18/31)
回答No.6

こにゃちわ。 プラットフォームに依存すると思いますです。 一般的にはunsignedだと当方はおもっちょります。 符号化するに当たってのメリットは、 「マイナス値をエラー値として扱える。」 くらいかな? デメリットは、 「CPU/MPUで些細な速度低下があるかもしれない」 プラットフォームによりますね。 signed/unsignedを切り替えての1000回実行で ベンチを取ってみるのも一興かと。 またバイト単位での速度低下も懸念してみます。 CPUが奇数アドレスへのアクセスを推奨しない場合とかあったりします。 (組み込み系とかで、日立のSH系とか…大半のRISC系でバスエラー アセンブルソースをみると、WORD単位でアクセスして 上位バイト・下位バイトの取り出しをやってたりする可能性とかありますです。 メモリは節約できますが、実行速度が微小ですが低下したりします。 しかしながら、uchar a[1000]; と ushort a[1000]; とuint a[1000]; とかで考えると…。普通にucharになるかと。

mtsed
質問者

お礼

なるほどです。 ありがとうございます。

関連するQ&A

  • 【なぜポインタを使うのか】

    私は、ポインタのメリット・デメリットを以下のように考えています。 ◆メリット メモリを多く確保しなければならないオブジェクトについて、コピー処理を行うことなく省メモリでインタフェースできる。 ◆デメリット ・関数内でしか使用しない非ポインタのローカル変数に比べ、  アクセス可能な場所が多くなってしまい、色んな箇所から値が変更されうる。(影響範囲の限定がしずらい) ・可読性が低くなる。(若いエンジニアはCの経験者は少なくっていくと思われるため、保守コストが若干割高になる) そのため、よっぽどメモリを多く使うようなオブジェクトでなければ、 (もしくは速度を重視する必要があるプログラムでなければ) 値渡しにしても良いのではと考えています。 しかし、度々目にするソースは、何でもかんでもポインタで処理しているものも多々見受けられます。 特に、int型のようなメモリを大量に使用しないものでも、ポインタで変数宣言しているケースもよく見ます。 なぜなのでしょうか? (熟練のC言語プログラマが、昔ながらの記述を踏襲しているというのはあるのかなと考えていますが)

  • 標準Cでのオブジェクト(変数)の定義について

    標準Cのオブジェクト(変数)の定義に「その内容によって、値を表現することができる実行環境中の記憶域の領域。ビットフィールド以外のオブジェクトは、連続する1つ以上のバイトからなる。そのバイトの個数、順序および符号化規則は、明示的に規定するかまたは処理系定義とする。 オブジェクトを参照する場合、オブジェクトは、特定の型をもっていると解釈してもよい。」とありますが、具体的に何を指しているのかが解りません。以下のように疑問点をまとめました。 1、「そのバイトの個数、順序および符号化規則は、明示的に規定するかまたは処理系定義とする。」    Int型 long型 double型等を例に取ると、「処理系定義」はそのバイト数が4バイト8バイトと考えられますが、「明示的に規定する」とは、Int型 long型 double型等で具体的にどのような定義を指しているのでしょうか? 2、「オブジェクトを参照する場合、オブジェクトは、特定の型をもっていると解釈してもよい。」とは、具体的に一体何を言いたいのか解りかねます。「参照」とは何を指しているのか?ポインタを指しているのか、「ポインタを指している」としたならなぜそれをここに書き加える必要があるのか?それとも、もっと一般的な事をいっているのか?もしもっと一般的な事を言っているならそれは何なのか? 宜しく願います。

  • 長方形符号について

    学校の課題において、次のような問題が出たのですが明らかに見当違いな値が出てしまい全然合いませんどうか解き方を教えていただけないでしょうか? 【問題】4bitの情報を2行2列として長方形符号にした。以下の問いに答えなさい。 (1)情報化率(情報速度)を既約分数で答えよ。 (2)符号間の最短のハミング距離を答えよ。 (3)訂正可能な誤りの数はいくつか? (4)パリティー検査法で訂正可能な誤りの個数を答えよ。 私が出した答えは、(1)1/2 (2)0 (3)0 (4)0なのですが、明らかにこれほど0が回答として出ることがないのでとても不安です。そうか解き方を含め回答を教えていただけないでしょうか?

  • VBAで符号無し整数

    BMPファイルを読み込んで配列に書き出すプログラムを作ろうとしています。 BMPファイルの構造は http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html のページに書かれてあるのですが、 typedef unsigned short WORD typedef unsigned long DWORD typedef unsigned char BYTE typedef long LONG などの「符号無し整数」で定義された変数を使う必要があります。 http://homepage1.nifty.com/rucio/main/kiso/DataType.htm のページにあるようにVBではUlongやUshortが使えるようなのですが、 VBA上で Dim bfSize As ULong とすると、「ユーザー定義型は定義されていません」 と表示されます。 参照設定のところで何か設定を行えば良いと思うのですがどこを設定すれば良いのでしょうか? もし、使えないとして、VBAで2バイトや4バイトを数値として読み込むにはどうすれば良いでしょうか?

  • 定数の定義方法 #define

    いつもお世話になっております。 定数を定義したいのですが、 その数値が符号無し長整数の場合どのように 定義すれば宜しいのでしょうか。 符号有りの場合は特に指定しなくても宜しいのですか。 どうぞ宜しくお願いします。

  • binファイルが軽くなる変数への代入処理について

    変数に値を代入する方法はいろいろあるかと思いますが、 コンパイル後に最もバイナリファイルが軽くなる処理はどのような処理でしょうか。 例として、1000バイトのデータを変数に代入する際、 (1)直接一つずつ代入する。 data[0] = 0x00; data[1] = 0x00; ・・・ data[999] = 0x00 (2)変数の定義時に代入(初期化)を行う。 unsigned char data[1000] = {0x00,0x00,・・・・0x00} 等ありますが、どちらの処理が有効でしょうか。 また、その他有効な処理方法等がありましたら、ご教授願います。 グローバル変数として定義するか、かローカル変数として定義するか、 defineで代入値を持つ等、定義時の方法でも違いがありましたら、 教えて頂けると助かります。

  • プログラムの原理について

    プログラムはメモリ上どのように展開されているのか、宣言した変数はメモリにどう割り付けられるのか、変数を参照したり、変数に値を入れるときはどういう仕組みになっているのか等わかりやすく教えてください。お願いします。 また、宣言、定義などといった言葉に関しての質問になるのですが、定義は記憶が割り当てられていて、宣言は割り当てられていないと本にはあるのですが、これはメモリとスタックとの違いでよいのでしょうか?また、構造体は定義されていると書かれているのですが、その構造体の中のintの宣言は、定義になるのでしょうか?

  • 変数の型を定義しなかった場合どうなりますか?

    現在、VBAを使ってプログラミングを行っているところなのですが、 一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか? では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか? 私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

  • 正の実数のみで書かれたバイナリーファイルの読み込み

    fortranにてバイナリファイルの読み込みを試みています。 そのファイルは4バイトの正の実数のみで書かれています。 符号がある無しで表示出来る実数の範囲が異なってくると思うのですが、正数値のみを取り扱わせるような変数宣言はfortranでどのようにすればよいのでしょうか? 単純に「real*4 変数名」と宣言すると読み込んだ値が明らかに 異常値を示します、endian処理はきちんとやっているので 符号のある無しが原因だと想定しています。お知恵をかしてください。

  • 一人暮らしを始める。敷金礼金について

    敷金礼金有りのメリット、デメリット 敷金礼金無しのメリット、デメリット それぞれ教えてください。