Problem set 4 whodunit - stdint.hとintN_t
stdint.hとintN_tに関するメモ、箇条書き
- stdint.hについて
intN_t: stdint.hにおいてtypedef 〇〇 intN_tで定義される。〇〇はint, long等既存の型(と言うより、正確には基本的な型としてコンパイラの中に存在する型)のこと。
intの表す数字の範囲はパソコン毎に異なる。
→パソコン&コンパイラ毎にint型に対応するビット数が決まる。よって、パソコン&コンパイラの組み合わせ毎にstdint.hが与えられており(自分のマシンに合わせたコンパイラをインストールすると、stdint.hは決まっている)、intN_tの定義され方が異なる。
- そのようなextraな型を定義しているのがstdint.h(中身を開くと単にtypedefが並んでいるだけ)
- マクロ: defineの事を言っている。defineは構文の名前
defineはマクロをdefineする事を言っている。
置き換える機能を使う為にdefineという構文が使われる。てか、構文なのこれって?やってること、関数と同じじゃん(うんうん by uni)。マクロはC言語コンパイル前に動くもの
(マクロ = テキストエディタの置換機能と捉えると良いかも)
#define N 16
ソースコード中にNという変数が現れたら16に変える
(これだけだとconstと完全に一緒)
int main() {
int i;
for (i = 0; i < N; ++i) {
printf(“hello\n”);
}
}
まずコンパイラはマクロ展開を行う
#define N 16が現れたら、その後はNを16に全て置き換える
→コンパイラされる
C言語入門(21)定数constとdefineの違い - Rui software
const とdefineは同じように見える時もあるが、それはたまたまで、基本的には別の概念である。
- stdint.hは…
intなどの型に対応するビット数がパソコン&コンパイラ毎に違うからコンパイラの付属物(ファイルとして別物)としてコンパイラ毎にstdint.hを定義する
前半のtypedefは、signed char等に対応するビット数がパソコン&コンパイラ毎に違うから、コンパイラ毎にかかれている。stdint.hを併用することでみんな同一のint8_tの概念が使用できる。
コンパイラとマシン = パソコンの組み合わせの数だけstdint.hが存在する。
人間がわざわざ2^8 / 2だから…って考えるのが面倒だからminの概念を作ってしまおう。マシン毎に負の数の表現方法が違うため、#define INT_MIN ()の()の中身は異なる。
※unsignedは全てのマシンで共通だけれど、signedは異なる可能性がある
だから、-128が最小の負の数のマシンでは、-128が入り、人間としてはINT_MINと扱いながら、
実際はコンパイル前に-128に全て置き換えられる。
以上は基本的には、でそうで無い場合もある(普通は無いと思うよ、by uni)。