質問: C(一応Objective-C)でフィボナッチ数列のプログラムを書こうとしたのですが fib[94]から値が変わってきてしまいます
回答: ※NSUIntegerの定義は、こうなってます。 typedef unsigned long NSUInteger; なので、(unsigned long)bでは、キャストする意味がありません。(それでなくても、あなたのしているキャストに意味がないんですが......) longの有効範囲は、32ビット環境と64ビット環境で変わるかもしれません。「ULONG_MAX」を出力して、unsigned longの最大値を確認しておきましょう。 ここより本題。 「桁あふれ」、「算術的オーバーフロー」と呼ばれる現象です。整数型の有効範囲を超えた数値は、ちゃんと扱えないという、そういわれれば納得するしかない理由です。 longより有効範囲の大きい、long longを使うことになるでしょうが、もちろんlong longでも有効範囲はあるので、桁あふれを考慮しないプログラムは、そういうプログラムを書いたプログラマの責任になります。 なお、long longの最大値はLONG_LONG_MAX、変換指定子は「%lldl」です。 もうひとつ。 unsignedでない、符号付き整数型(負数も扱える整数)では、いちばん左の1ビットを、正負のフラグとして使用します。0なら正数、1なら負数です。桁あふれを起こすと、いちばん左のビットが位上がりで0から1になり、負数になってしまいます。