はじめに
型はプログラミングをやる上で必ず学ぶ基本的なシステムのひとつです。特に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をインクルードしなくても使えるときと、しないとエラーになることがあります。なぜでしょう。
参考サイト
- 2016年、C言語はどう書くべきか (前編)
https://postd.cc/how-to-c-in-2016-1/