- ベストアンサー
固定長なデータ型の定義
int型などは可変長型なのでサイズは16ビット、32ビット、 64ビットなどC言語だと環境によって異なってきますよね? さらにlong型は32ビット64ビットの可変長でも、 long long型は64ビット固定長型であったり、 long int型は32ビットが保証値だとか、 shortを付けるとサイズが小さくなるのかだとか、 非常に煩わしいのでどの環境でも常に同じサイズで定義できるよう 全てtypedefで固定長にしたいと考えています。 (できれば__int32等は言語仕様では無いので使いたくないので…) ですが検索するとどうも情報が各サイトごとに微妙に違ってたりして 私には正しいかどうかの判断が付かなくなってしまいました。 (C言語以外もあったのでそのせいかもしれませんが;) 以下のように、8ビット、16ビット、32ビット、64ビット、 32ビット浮動小数、64ビット浮動小数を定義したいのですが どうかアドバイスをいただけないでしょうか? 宜しくお願い致します typedef int8 signed char; // -127~127 typedef int16 //16ビット固定整数 typedef int32 //32ビット固定整数 typedef int64 //64ビット固定整数 typedef dec32 //32ビット固定浮動小数 typedef dec64 //64ビット固定浮動小数
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
可変長という表現も変ですが、C言語の型のサイズは、すべて処理系定義です。charもshortもintもlongもlong longもfloatもdouobleもlong doubleも例外はありません。_Boolだけは確実に1ビットですが、_Bool型が占有するメモリサイズは処理系定義になります。 どの処理系でも常に同じサイズで定義するのはC言語では不可能です。というのも、8ビットとか16ビットとかの型が存在しない処理系もあるからです。 現実的には、あらゆる処理系を網羅するのではなく、自分が対象とする処理系を特定し、その間で有効な手段を検討するのが一番です。 お勧めの方法は、<stdint.h>で定義される、int8_t, uint8_t, int16_t, uint16_t, ..., int64_t, uint64_tなどを使うことです。 これらは、サイズが保証されるだけでなく、負の値の内部表現が2の補数であることも保証されます。ただし、処理系によっては一部または全部の型が定義されないことがあります。思い切ってそれらの処理系を切り捨てられるのであれば、一番現実的な解決策かと思います。 なお、<stdint.h>はC99で導入されたヘッダですので、C99に未対応の処理系や非標準処理系には存在しません。それらの古い、または方言である処理系は、思い切って切り捨てるか、それが無理なら、<stdint.h>を自作する必要があります。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
バイト数だけなら char とその仲間が 1バイトと決まっていますが, 実際には「1バイト」も「8ビット以上」となっているだけなので, 「全ての処理系でビット数を固定する」のは無理がありますね. まあ, 自分で全部書けばいいんですが.