LoginSignup
23
18

More than 3 years have passed since last update.

あなたの型宣言、モダンですか?

Last updated at Posted at 2019-06-30

はじめに

はプログラミングをやる上で必ず学ぶ基本的なシステムのひとつです。特にCやC++のような静的型付け言語では変数を定義するときに型を指定しなければならないので、まず最初に学ぶことになります。

「そんなんわかってるわ!初心者向けの説明かよ!」と思われる熟練者の方もいるかも知れませんが、あなたの型宣言はきちんとモダンなものになっていますか?

stdint使ってますか?

突然ですが、int型が何バイトかあなたは即答できますか?

4バイトと答えられたあなたは勉強熱心です。じゃあlongは?charは?unsigned longは?

「そんなん8バイト、1バイト、8バイトに決まってるやんけ!」というみなさん、すごいです。私のようなぼんくらは覚えてられません。しかし今後16バイトや32バイトの整数型が必要になったらどうするんですか?unsigned long long intみたいな型を作るんですか?まあそれはジョークですが...。ジョークのようですがC99ではすでに準備されているそうです。やばい。

ともかく、これらの型名は古くからあるものですが、可読性がよくありません。charという名前にはどこにもそれが1バイトのシーケンスを表すという意味はありません。

それに、システムによってintなどの型の長さが変わる場合があります。RATLONALEの節を見てください。

16bitシステムではint型は16bit(2バイト)ですが、32bitでは32bit(4バイト)です。これは致命的です。

そこでモダンなC/C++には、統一的な命名ができるようstdint.hという型システムが用意されています。

サイズ 符号あり 符号なし
8 int8_t uint8_t
16 int16_t uint16_t
32 int32_t uint32_t
64 int64_t uint64_t

unsigned int は長すぎて打つのに疲れます。uint32_t のほうがしゅっとしてて的確なのでわかりやすいですね。

やむを得ずintやcharを使う場合

レガシーなライブラリがintやcharを要求する場合。

名前しかちがわないので、キャストしてやりましょう。

//結局危険
int32_t nnn
legacy_func((int)nnn)

よくわからないこと

  • 同じgccでも、stdint.hをインクルードしなくても使えるときと、しないとエラーになることがあります。なぜでしょう。

参考サイト

23
18
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18