«Inline C» - вопрос - PullRequest
       37

«Inline C» - вопрос

5 голосов
/ 27 февраля 2011
#!/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;
}

Вывод:

-2

Почему я получаю здесь вывод "-2"?

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Perl поддерживает целые числа со знаком и без знака, и его операторы будут переключаться между ними, но вы явно запрашиваете IV (тип SV со знаком).Используйте вместо этого newSVuv.Вы также должны сказать UV a = или unsigned a = вместо int, если целые числа являются 32-битными, но perl использует 64-битные целые числа, так как в противном случае приведение к UV, выполненное newSVuv, в конечном итоге приведет к расширению знака до 32 старших бит.

5 голосов
/ 27 февраля 2011

int a использует, вероятно, 32-битное представление. Вам следует использовать unsigned int, если вы хотите представить значения выше 4 294 967 296 / 2.

...