~0って何?

何か見たこと無いのが出た。

% perl -le 'print ~0'
4294967295
% perl -le '$hoge = ~0; print $hoge'
4294967295
% perl -le '$hoge = ~1; print $hoge'
4294967294
% perl -le '$hoge = ~2; print $hoge'
4294967293
% perl -le '$hoge = ~3; print $hoge'
4294967292


何だこれは。

% perldoc perlop

       Symbolic Unary Operators

       Unary "~" performs bitwise negation, i.e., 1’s complement.  For example, "0666 & ~027" is 0640.  (See also "Integer Arithmetic"
       and "Bitwise String Operators".)  Note that the width of the result is platform-dependent: ~0 is 32 bits wide on a 32-bit plat-
       form, but 64 bits wide on a 64-bit platform, so if you are expecting a certain bit width, remember to use the & operator to
       mask off the excess bits.


       Integer Arithmetic

       Used on numbers, the bitwise operators ("&", "│", "^", "~", "<<", and ">>") always produce integral results.  (But see also
       "Bitwise String Operators".)  However, "use integer" still has meaning for them.  By default, their results are interpreted as
       unsigned integers, but if "use integer" is in effect, their results are interpreted as signed integers.  For example, "~0" usu-
       ally evaluates to a large integral value.  However, "use integer; ~0" is "-1" on twos-complement machines.

斜め読み

  • 1の補数だそうだ
  • 結果はプラットフォームに依存するよ
  • 32bit環境と64bitでは値が違うよ
  • 確実なビット長が知りたいなら & オペレータでマスクオフれ
  • use integer;とかno integer;がどうとか