Problem set 4 whodunit - stdint.hとintN_t

stdint.hとintN_tに関するメモ、箇条書き

intN_t: stdint.hにおいてtypedef 〇〇 intN_tで定義される。〇〇はint, long等既存の型(と言うより、正確には基本的な型としてコンパイラの中に存在する型)のこと。
intの表す数字の範囲はパソコン毎に異なる。

  • まず、int型のビット数の候補がマシンによって与えられ、そこからコンパイラが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)。