gpt4 book ai didi

c - Erlang NIF 数字返回类型

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:58 24 4
gpt4 key购买 nike

我正在试验 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,这很可能是一个 64 位带符号整数范围 -(2^63)(2^63)-1。此外,enif_get_long 需要一个long int,而不是long long。由于根据 docs 的溢出,您还应该得到从 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_* 的返回值,以确保您没有处理未初始化的数据。

关于c - Erlang NIF 数字返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37076798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com