Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NUM2LL和NUM2INT从Ruby传递到C时修改的数据_Ruby_Ruby C Extension - Fatal编程技术网

使用NUM2LL和NUM2INT从Ruby传递到C时修改的数据

使用NUM2LL和NUM2INT从Ruby传递到C时修改的数据,ruby,ruby-c-extension,Ruby,Ruby C Extension,我有一个C模块,我正在用Ruby test通过这段C代码扩展Ruby进行测试。正在修改2**24-1以上的任何数字。我需要在Ruby和C之间来回传递64位值,它应该是位精确的。如有任何想法,将不胜感激 in c extension: long int sig_val; sig_val = NUM2LL(sig) // sig is type VALUE and is ruby number to be passed on to C 。 . . 我传递的几个数据示例: (2^34-1)*16=

我有一个C模块,我正在用Ruby test通过这段C代码扩展Ruby进行测试。正在修改2**24-1以上的任何数字。我需要在Ruby和C之间来回传递64位值,它应该是位精确的。如有任何想法,将不胜感激

in c extension:
long int sig_val;
sig_val = NUM2LL(sig) // sig is type VALUE and is ruby number to be passed on to C
。 . . 我传递的几个数据示例:

  • (2^34-1)*16==>C接收(2^34)*16
  • (2^34+1)*16==>C接收(2^34)*16
  • (2^24+1)*16==>C接收(2^24)*16
  • (2^25-1)==>C接收(2^25)
  • (2^24-1)==>C接收(2^24-1)(正确)
下面的任何数字都是正确的


谢谢大家!

从评论中复制答案,以便从“未回答”筛选器中删除此问题:


我刚刚意识到,在代码中,有一个类型转换为float,导致ruby将位数限制为24位(我猜是单点IEEE754)。现在我可以使用NUM2LL和LL2NUM传递64位宽的数字。多谢各位


~answer per

Ruby使用一些较高的位作为标志(这是一种优化,它允许常用的较小整数本身,而不是强制将它们包装在一层间接寻址中),听起来好像您在某处遇到了这些标志位。您如何测试C接收到的内容?一个或多个反向转换也可能受到影响,使问题看起来更复杂。另外,您在测试中是编译为64位还是32位?如果是前者,您可能不需要
long
谢谢您的时间。。。我在正在包装的C函数的入口点打印数据。另外,我使用了sizeof(),long int是8字节,int是4字节。我现在正在考虑将ruby数字作为8字节数组(char)发送,并在将它们发送到C例程之前在包装扩展层中相应地相加。mu太短了,我同意。。。我实际上意识到,无论数字的大小如何,它只保留24位,并将其四舍五入,这样就可以用24位和一堆零值来表示数字(或近似值),我刚刚意识到,在代码中,有一个类型转换为float,它使ruby将位数限制在24位(根据单点IEEE754我猜)。现在我可以使用NUM2LL和LL2NUM传递64位宽的数字。谢谢