タイプの正確なサイズを知らなくても、数値を格納することは実際には非常に一般的です。私のプログラムには、20億を超えないと合理的に想定できる、または超えないように強制できる量がたくさんあります。しかし、それは私がそれらを格納するために正確な32ビットタイプが必要であることを意味しません。少なくとも20億に数えることができるどんなタイプでも私は問題ありません。
非常に移植性の高いコードを作成しようとしている場合は、固定幅タイプはすべてオプションであることに注意する必要があります。
がないCHAR_BIT
よりも大きいC99実装の場合。標準では、パディングビットが必要になるため、存在することが禁止されており、タイプにはパディングビットがないように定義されています(7.18.1.1 / 1)。したがって、(ありがとう、ouah)実装が。なしで定義することは許可されていないため、これも禁止されています。8
int8_t
intN_t
uint8_t
uint8_t
int8_t
したがって、非常に移植性の高いコードでは、127までの値を保持できる符号付き型が必要な場合は、、、、またはコンパイラにそれを作成するように依頼するかどうかに応じて、のいずれかを使用する必要がありsigned char
ますint
。int_least8_t
int_fast8_t
- C89で動作する(
signed char
またはint
)
- 算術式での驚くべき整数昇格を回避する(
int
)
- 小さい(
int_least8_t
またはsigned char
)
- 高速(
int_fast8_t
またはint
)
unsigned char
同じことが、、、、およびを含む255までの符号なしタイプにも当てはまりunsigned int
ます。uint_least8_t
uint_fast8_t
非常に移植性の高いコードでモジュロ256演算が必要な場合は、モジュラスを自分で取得するか、ビットをマスクするか、ビットフィールドでゲームをプレイすることができます。
実際には、ほとんどの人は、移植性のあるコードを書く必要はありません。現時点CHAR_BIT > 8
では、専用ハードウェアでのみ発生し、汎用コードは使用されません。もちろん、それは将来変更される可能性がありますが、PosixやWindows(どちらも保証CHAR_BIT == 8
)について仮定するコードが非常に多いと思われる場合は、コードの非移植性に対処することは、その新しいプラットフォームにコードを移植するための多大な努力。そのような実装はおそらく、コードを起動して実行する方法を心配するずっと前に、インターネット(オクテットを扱う)に接続する方法について心配する必要があります:-)
とにかくそれを想定しているのであれば、C89でコードを機能させたい場合を除いCHAR_BIT == 8
て、避けるべき特別な理由はないと思います。(u)int8_t
C89でもstdint.h
、特定の実装のバージョンを見つけたり作成したりすることはそれほど難しくありません。ただし、型が保持できないことを要求するのではなく、型が保持できることだけを要求するようにコードを簡単に記述できる場合は、への依存を回避することをお勧めします。255
256
CHAR_BIT == 8