c-Erlang NIF数字返回类型



我正在试验NIF,我对Erlang使用的数字类型感到困惑,因为我的精度有些奇怪。

这里有一个例子:

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不能处理这么大的数字?

184467440737095516142^64 - 2,因此无法放入long long,后者很可能是一个范围为-(2^63)(2^63)-1的64位带符号整数。此外,enif_get_long需要long int,而不是long long。您还应该得到一个从enif_get_long返回的错误值,因为根据您没有检查的文档溢出。

要计算2^64 - 1以下的数字(包括有问题的数字),可以使用enif_get_uint64

此代码应该有效(未经测试):

ErlNifUInt64 l, r;
enif_get_uint64(env, argv[0], &l);
enif_get_uint64(env, argv[1], &r);
return enif_make_uint64(env, l & r);

您还应该检查enif_get_*的返回值,以确保您没有处理未初始化的数据。

相关内容

  • 没有找到相关文章

最新更新