「2016年、C言語はどう書くべきか」はとても考えさせるし、あるところは賛同できるし、他の所ではそれはないだろうと思うところもあるような、そんな文章です。多くの賛成と反対があり、これが絶対に良いとも悪いとも言えないと言うことだけは言えると思います。
さて、intN_t
を使えという話ですが、単純にlong
をint64_t
に置き換えるだけで済むのか…という話ではありません。
一つはAPIや関数です。printf
のフォーマット文字列も"%ld"
ではなく"%" PRId64
を使う必要があります。fseek
の第2引数はlong
ですが、int64_t
をそのまま渡せるとは限りません。場合によっては、正しくキャストする必要があります。
次に、long
は32bit以上であることは保証されていますが、64bitであるとは限りません。32bit環境のほとんどでは32bitですし、64bit環境でもWindows上では32bit、UNIX/Linuxでは64bitと、OSやアーキテクチャによって異なります。単純な置き換えで完全に互換なわけではありません。
面倒になってきましたが、では、なぜintN_t
を使えと言うのかです。それは、ビット数をプログラマーが確定できると言うことです。int
やlong
は環境によってそのビット数が異なります。long
を使うのであれば、32bit以上ということしか保証されず、ちょうど32bitであると前提にすることはできません。もし、そのようなコードを書くのであれば、プリプロセッサで分岐したコードを書く必要があるでしょう。しかし、int32_t
であれば32bitであることが保証されます。32bitを前提にしたコードを書くことができるでしょう。
さて、これらの正体は何か?実際、int32_t
はint
やlong
のtypedefです。もし、コンパイラが32bitの整数値の型を持っていない場合は、コンパイル時にエラーになります。C11としてもint32_t
等は必須では無く、オプションです。ただ、現在のほとんどの環境では存在するでしょう(存在しない環境を私は知りません)。もし、32bit以上という事だけが必要条件なら、int_fast32_t
やint_least32_t
を使った方が良いかもしれません。これらはオプションでは無く、必ず存在するからです。
また、char型とint8_t型での違いはあるのですか?(もちろんchar型に限らず!)
同じである場合もあるし、違う場合もあります。まず、char
はsigned char
とunsigned char
のどちらかになりますが、どちらになるのかは環境依存です。つまり、char
がuint8_t
の場合もあり得ます。次にchar
の大きさは1Byteですが、C11の仕様上は1Byteは8bit以上としか定められていません。つまり、charが9bitのシステムもあり得るのです(私はそのようなシステムを見たことありませんが、仕様上はあり得るという話です)。そのようなシステムの場合はint8_t
やuint8_t
は存在せず、char
と同じと言うことはありません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/04 20:33
2016/09/07 02:32
2016/09/07 09:17