整数リテラル

昨日の日記に書いた整数リテラルのバグの件、
別に●芝のコンパイラが悪いのではなく、(かなりアホなコンパイラなんですが)
僕の認識不足でした。


intが16ビットの処理系なので、無印の整数リテラルは16ビットすなわちshort型とみなされるようで、


unsigned long hoge = (4950*4096+500)/1000;
と書くと、4950*4096+500 = 20275700 = 0x13561F4 が桁あふれで
0x61F4 = 25076 となり、 hoge = 25076 / 1000 = 25 となります。
これを防ぐには、long型であることを示すために整数リテラルの末尾にLをつければいいんですね。

unsigned long hoge = (4950L*4096L+500L)/1000L;
う〜ん、失敗、失敗。