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

왜'use 5.012'입니까? – ysth

+1

그래서 "use strict; use 5.010;"을 쓰지 않아도됩니다. 그래서 저는 파일의 마지막 판의 세기를 압니다. –

답변

5

int a은 아마도 32 비트 표현을 사용합니다. 4,294,967,296/2보다 큰 값을 나타내려면 unsigned int을 사용해야합니다.

+1

64 비트 int를 지원하는 perl을 제외하고는 도움이되지 않습니다. – ysth

5

Perl은 부호있는 정수와 부호없는 정수를 모두 지원하며 연산자는 이들 사이를 잘 전환하지만 명시 적으로 IV (부호있는 int 유형 SV)를 요청합니다. 대신 newSVuv를 사용하십시오. 또한 int가 32 비트이지만 perl이 64 비트 정수를 사용하는 경우 int 대신 UV a = 또는 unsigned a =을 말해야합니다. 그렇지 않으면 newSVuv에 의해 수행 된 UV 로의 캐스트가 상위 32 비트를 통해 부호 비트를 확장하게됩니다.

+0

"UV a ="없이 newSVuv 만 변경하면 결과가 달라집니다. –

+0

@sid_com : 아, 64 비트 정수를 사용하는 perl을 가지고 있지만 "int"가 32 비트라면 둘 다 필요합니까? – ysth