2011-02-27 9 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; 
} 

Salida:"línea C"-la pregunta

-2 

¿Por qué aparece aquí una salida de "-2"?

+0

¿por qué 'use 5.012'? – ysth

+1

Así que no tengo que escribir "use strict; use 5.010;". Y entonces sé el siglo de la última edición del archivo; –

Respuesta

5

int a usa probablemente una representación de 32 bits. Debe usar unsigned int si desea representar valores superiores a 4,294,967,296/2.

+1

Eso no ayudará, excepto en un perl con soporte int de 64 bits. – ysth

5

Perl admite enteros con signo y sin signo, y sus operadores cambiarán muy bien entre ellos, pero usted está solicitando explícitamente un IV (firmado int tipo SV). Use newSVuv en su lugar. También necesita decir UV a = o unsigned a = en lugar de int si las entradas son de 32 bits, pero perl usa enteros de 64 bits, ya que de lo contrario el lanzamiento a UV realizado por newSVuv terminará extendiendo el bit de signo a través de los 32 bits superiores.

+0

Cuando solo cambio newSVuv sin "UV a =" obtengo un resultado diferente. –

+0

@sid_com: ah, si tiene perl usando 64 bit ints pero un "int" es de 32 bits, ¿necesita ambos? – ysth