2014年11月12日

Lua 5.3の整数型

Lua 5.3で追加された待望(?)の整数型に関するメモです。Lua 5.3 beta時点のものでリリース版では変更となる可能性があります。

整数型はデフォルトではC言語のlong longもしくは__int64(Windows)で、コンパイル時に"LUA_32BITS"が定義されているとlong、"LUA_INT_INT"が定義されているとint、"LUA_INT_SHORT"が定義されているとshort intが使用されます。short intはテスト用に用意されているだけで非推奨のようです。

ちなみに、数値型はデフォルトではdoubleで、コンパイル時に"LUA_32BITS"が定義されているとfloat、"LUA_REAL_LONGDOUBLE"が定義されているとlong doubleが使用されます。Lua 5.2ではdoubleが使用されています。

この辺りの詳細は、luaconf.hをご覧ください。

 
Lua 5.2にあったbit32ライブラリが廃止され、ビット演算子が導入されました。
& 論理積
| 論理和
~ 排他的論理和
<< 左シフト
>> 右シフト
~ 否定

以下、使用例です。
print( 10 & 8 )   --> 8
print( 8 | 1 )   --> 9
print( 255 ~ 15 )   --> 240
print( 8 << 1 )   --> 16
print( 8 >> 1 )   --> 4
print( ~0 )   --> -1

 
また、整数用の演算子が1つ追加されています。割り切れないときはマイナス方向に丸めるようです。
// 整数除算
以下、除算演算子と整数除算演算子の使用例です。
print( 10 / 6 )   --> 1.6666666666667
print( 10 // 6 )   --> 1
print( 10 / 9 )  --> 1.1111111111111
print( 10 // 9 )  --> 1
print( -10 / 9 )   --> -1.1111111111111
print( -10 // 9 )   --> -2
print( 10.0 // 3.0 )   --> 3   ( 10.0と3.0は整数で表現可能なのでOK )
print( 10.5 // 3.0 )   -->  エラー!   ( 10.5は整数で表現不可能なのでNG )
print( 10.0 // 3.5 )   -->  エラー!   ( 3.5は整数で表現不可能なのでNG )


数値型が文字列に変換されるときに、小数点以下の数値がゼロのときでも".0"が付加されるようになりました。

-- Lua 5.2
print( 2.0 )   --> 2
print( 2 )   --> 2

-- Lua 5.3
print( 2.0 )   --> 2.0
print( 2 )   --> 2

Lua 5.2と同じ結果を得るには、前述の整数除算演算子を使用するか、5.3で追加されたmath.tointeger関数を使用します。math.tointegerは1つの引数をとり、引数が整数で表現可能であればその整数を返し、整数で表現不可能であればnilを返します。
x = 2.0
xx = math.tointeger( x )
if not xx then
    xx = x
end
print( xx )   --> 2




【参照】
Lua 5.3 Reference Manual
http://www.lua.org/work/doc/manual.html

0 件のコメント:

コメントを投稿