4

0 から 65535 までループする多数の数値があります (適切なカットオフ ポイントを得るために、単純に 16 ビットを選択しました)。int をインクリメントしていますが、int が 65536 かどうかを確認する if ステートメントがあります。そうであれば、int を 0 に設定します。少しぎこちないですが、うまくいきます。short int を使用してオーバーフローさせる方がはるかに効率的であることはわかっていますが、short は 2 バイトであることが保証されていないため、最初はそうしませんでした。

これは、Linux (ubuntu) マシンで実行される C コードです。短いものを使用し、後でこのプログラムを別のOSで実行することにした場合(または、現在32ビットマシンでテストしているため、64ビットマシンで実行する場合)、かなりの可能性があります私のショートはまだ2バイトになりますか?いくつかの異なるマシンで簡単にテストできますが、ここにいる人の中には、たくさんのコンピューターで作業したことがある人もいます。私が気をつけなければならない恐ろしい落とし穴はありますか?

4

8 に答える 8

7

intなどの組み込み型のサイズは保証されませんchar。(たとえば、この質問を参照してください。これはC ++に関するものですが、この点に関して私が知る限り、Cについても正確です)

固定サイズの整数型が必要な場合は、C99 のものを含め、<stdint.h>そこで定義されている固定幅の型を使用してください。

于 2011-02-13T19:08:19.787 に答える
5

Short は、ほとんどのコンパイラで 16 ビットです。合理的であれば、おそらく仕事にビットフィールドを使用します。

struct { 
    unsigned short my_number : 16;
};

いずれにせよ が 16 ビットである典型的なケースでshortは、これはオーバーヘッドを課しません。また、値を適切な範囲にクランプするために追加のコードを挿入する必要があるまれなケースでは、これは自動的に処理します。

唯一の欠点は、 内にビットフィールドしか持てないことですstruct

編集: @earlz が回答を削除したのは残念です。なぜなら、彼のアイデアは実際には彼が考えていたよりも優れていたからです。C99 実装に 16 ビットの符号なし整数型がある場合、uint16_tその型の typedef として提供する必要があります。指定する場合、これは正確に 16 ビット幅でなければなりません。彼の説明に適合するもありuint_least16_tます (少なくとも 16 ビット幅ですが、それ以上になる可能性があります)。

于 2011-02-13T19:10:16.433 に答える
3

ショートが16ビットであるという保証はありません。たとえば、16ビットを使用するよりもはるかに効率的であるため、ショートに32ビットを使用するコンパイラを使用しました。(ARMアーキテクチャについて)

ただし、16ビットであることが保証されている型を使用するのは非常に簡単であり、これが当てはまらないコンパイラを使用しようとするとすぐに警告するアサーションチェックを追加できます。

ASSERT(sizeof(short) == 2);
于 2011-02-13T19:59:02.237 に答える
3

いいえ、想定できる唯一のことは、short が int よりも大きくないということです。

テストなしで 65535 の後に 0 にラップアラウンドする場合は、次の方法で実行できます。

unsigned int i;
...

i = (i + 1) & 0xffff;
于 2011-02-13T19:07:15.690 に答える
2

Ashortはいくら長くなるだろうとsizeof言っています。C 標準では、ashortは少なくとも 16 ビットである必要があると規定されています。多くの場合、よりも小さい必要はありませんint

于 2011-02-13T19:10:29.273 に答える
0

MAX_SHORTを使用してプラットフォームを見つけ、sizeof(short)それをヒットするまで繰り返します。

于 2011-02-13T19:09:19.030 に答える
0

C99に従えば、次のことを安全に想定できます。

a `short int` may have a minimum value of `-32767`
                         maximum value of `+32767`
an `unsigned short int` may have a minimum value of `0`
                                   maximum value of `65535`

5.2.4.2.1 Sizes of integer types <limits.h>など、標準で目撃されています。もちろん、標準では、前述のセクションで定義されている最大値は、実装で定義されているサイズと同じか、それよりも小さいことを明示的に示しています。したがって、short または unsigned short のサイズは、上記のサイズよりも大きくなる可能性があります。ただし、 より大きくなることはありませんint

于 2011-02-13T19:10:57.347 に答える
-1

or を使用すると、より大きな型を使用して各反復でoruint16_tを実行できると主張する場合。これは、条件を実行してゼロにリセットするよりもはるかに高速であることを保証します.x %= 65536;x &= 65535

于 2011-02-13T19:27:23.893 に答える