ユユユユユ

webエンジニアです

ループイテレータの型を思考停止で int 型にしてはならない

 y = f(x) = x^5 となるような写像 f を作ろうとして次のようなコードを書いてハマった。

unsigned long long N[1000];
for (int i = 0; i < 1000; i++) {
  N[i] = i*i*i*i*i;
}

 Nunsigned long long と定義しているが、 i^5iint としてしまっている。当然、右辺の計算結果をまず用意した上で左辺に代入するわけだから、これでは代入する前にオーバーフローしてしまう。

 というわけで、イテレータにも配列と同じ型を宣言して、なんとかこれを解消する。

  unsigned long long N[1000];
- for (int i = 0; i < 1000; i++) {
+ for (unsigned long long i = 0; i < 1000; i++) {
    N[i] = i*i*i*i*i;
  }

 理屈は納得できるし、実際こう書いて正しい結果を出せる。しかし感覚的にはいまいちピンとこない感じがする。そもそも整数型の使い分け自体をずいぶん適当なさじ加減でやってしまっているので、まずはそこから矯正しないといけないのかもしれない。