久しぶりにC言語で、簡単なプログラムを書いてみました。
動機はこれ。
if ( $counter != 0 ){ ......(何かの処理) }
こんなPHPのソースを見たのですが、 PHPって、int型(型のない言語ですが)の値をインクリメントし続けるとどうなるの? という疑問が湧いたからです。
そこで、こんなプログラムを書きました。 ソース(test.php)
<?php $i = PHP_INT_MAX; echo $i."\n"; $i++; echo $i."\n";
phpには、PHP_INT_MAXという定義済み定数があって、intの最大値を示しています。 これに、+1するとどうなるかというプログラムです。
実行すると、 $ php test.php 9223372036854775807 9.2233720368548E+18 と、int型のMAXを越えるとfloat型になっています。
C言語の場合は、int型がMAX値を越えるとこうなります。 ソース(test.c)
#include <stdio.h> int main(void){ int i = 0; while( ++i > 0 ); printf( "%d",i ); }
Cにも、intの最大値を示す定数(定義)はありますが 1からインクリメントする形でプログラムを作成してみました。 (結果はどうなるか知っているので、while()でループさせています) これをコンパイルして実行すると、 $ cc test.c $ ./a.out -2147483648 と、見事にマイナス値になりました。 因みに、宣言部分をunsigned int にすると0になります。
*
Cの方がbit列としては分かりやすい形です。
PHPの方はサイズオーバーになったらより大きな型に自動変換ですね。
気が向いたら、Javaではどうなるかを試してみます。
**
大昔、日本語で書かれたCの関連書籍が少なかった頃、ほとんどのCプログラマーが一度は読んでいた「はじめてのC」という本を思い出しました。
タイトルが意味深すぎて、電車で読んでると周りの人から変な目で見られたという伝説が残ってます。