2011-02-27 61 views
5
#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Inline 'C'; 

my $value = test(); 
say $value; 

__END__ 
__C__ 
void test() { 
    int a = 4294967294; 
    Inline_Stack_Vars; 
    Inline_Stack_Reset; 
    Inline_Stack_Push(sv_2mortal(newSViv(a))); 
    Inline_Stack_Done; 
} 

输出:“内联C” -question

-2 

为什么我来到这里的 “-2” 的输出?

+0

为什么使用5.012? – ysth 2011-02-27 22:36:52

+1

所以我没有写“使用严格;使用5.010”。所以我知道该文件的最后一个版本的世纪; – 2011-03-01 05:59:57

回答

5

int a使用可能的32位表示法。如果您想要表示超过4,294,967,296/2的值,则应该使用unsigned int

+1

这不会有帮助,除了在64位int支持的perl上。 – ysth 2011-02-27 22:41:43

5

Perl支持带符号和无符号整数,其运算符将在它们之间很好地切换,但是您明确要求使用IV(带符号整数类型的SV)。改用newSVuv。如果整数是32位,但是perl使用64位整数,则还需要说UV a =unsigned a =unsigned a =,否则由newSVuv完成的UV转换将最终将符号位扩展到高32位。

+0

当我只更改newSVuv而没有“UV a =”时,我得到了不同的结果。 – 2011-03-01 05:57:11

+0

@sid_com:啊,如果你有perl使用64位整数,但“int”是32位,你需要两个? – ysth 2011-03-01 06:18:24