2011-02-27 78 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