Ich experimentiere mit NIFs und bin verwirrt darüber, mit welchen Nummerntypen Erlang arbeitet, weil ich mit meinen Genauigkeiten ein bisschen komisch bin.Erlang NIF-Zahl Rückgabetypen
Hier ist ein Beispiel:
erlang:band(18446744073709551614, 5) == 4
Und aus dem Inneren eines NIF, die etwa wie folgt aussieht:
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);
ich ein 1
als Ergebnis.
Hat das etwas damit zu tun, dass die C-Schicht nicht die richtige "Größe" der Nummer hat? Oder ist das enif_(get|make)_long
nicht der richtige Weg, um mit einer Nummer dieser Größe umzugehen? Oder können NIFs nicht mit so großen Zahlen arbeiten?
Dieses Beispiel funktioniert, danke für beides und die Erklärung. Ich habe nicht bemerkt, dass 'ErlNifUInt64' für diesen Fall existiert. Ich werde definitiv die Überprüfung hinzufügen, ich habe gerade mit dem Versuch gespielt, das funktioniert zu bekommen :). Wird 'ErlNifUInt64' grundsätzlich irgendeine Zahl abdecken, die Erlang erlaubt? – whitfin
Nein, nur "0" bis "18446744073709551615" (der Bereich von vorzeichenlosen 64-Bit-Ganzzahlen). – Dogbert
Also wäre ein geeigneter Weg, sowohl Negative als auch Positive zu behandeln, einfach das Zeichen auf der Erlang-Seite zu überprüfen und separat im NIF zu implementieren? – whitfin