1<<31 は 1 より大きい?小さい?

perl -e "print 1 < (1<<31);"
perl -M"integer" -e " print 1 < (1<<31);"

前者は1を出力、後者は何も出力されない。
C言語で32bitなint型であれば、1<<31で最上位bitが1になるため、-2147483648という扱いになる。
しかしPerlでは型が厳しく決まっていないので、数値の演算はほとんど浮動小数点演算で行われるらしい。
integerプラグマを使うことで、整数演算を明示することができる。当然、その間は実数は使えないが。

use integer;
http://perldoc.jp/docs/modules/integer-1.00/integer.pod

・・・って浮動小数点演算から整数演算に切り替えを明示したところで、1より小さくなるという理由にならないよね!

perl -e" print ((1.123)<<31);"
perl -e" print ((2.123)<<30);"

結果はともに2147483648。
どうやら、小数点以下を切り捨てた整数部分をビットシフトしているだけのようです。
まぁ当然といえば当然か!
・・・ってこれも、1より小さくなるという理由にはならないね!
ああ、どんどんずれていくry


perl -e" printf ('%d',(1<<31));"
でもプラグマを指定しなくても、printfのフォーマットで%dを指定すると、ちゃんと-2147483648と出力がされる。

結論

Perlというものがよくわからない。