私はNIFを試していますが、Erlangがどのような数値型を扱っているのか混乱しています。ここでErlang NIF番号の戻り値の型
は例です:
erlang:band(18446744073709551614, 5) == 4
そして、このようになりますNIF内部から:
long long l, r;
enif_get_long(env, argv[0], &l);
enif_get_long(env, argv[1], &r);
return enif_make_long(env, l & r);
私は結果として1
を取得します。
これは、数字の正しい「サイズ」を保持していないCレイヤーと関係していますか?または、enif_(get|make)_long
はこのサイズの番号を扱う正しい方法ではありませんか?それとも、NIFがこのような大きな数値では動作しないのか?
この例はうまくいきます、それとその説明の両方に感謝します。私は、このケースでは 'ErlNifUInt64'が存在することを認識しませんでした。私は間違いなくチェックを追加します、私はちょうどこれを取得しようとして遊んでいた:)。 'ErlNifUInt64'は基本的にErlangが許可する任意の数をカバーしますか? – whitfin
いいえ、 '0 '〜' 18446744073709551615'(符号なし64ビット整数の範囲)。 – Dogbert
したがって、ポジティブだけでなくネガも扱う適切な方法は、Erlang側のサインをチェックし、NIFに個別に実装することでしょうか? – whitfin