【问题标题】:"Inline C"-question“内联 C”问题
【发布时间】:2011-07-05 05:12:49
【问题描述】:
#!/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”的输出?

【问题讨论】:

  • 所以我不必写“使用严格;使用 5.010;”。所以我知道文件上一版的世纪;

标签: c perl types inline


【解决方案1】:

Perl 支持有符号和无符号整数,并且它的运算符可以在它们之间很好地切换,但是您明确地请求一个 IV(有符号 int 类型 SV)。请改用 newSVuv。如果 int 是 32 位但 perl 使用 64 位整数,您还需要说 UV a =unsigned a = 而不是 int,因为否则 newSVuv 完成的 UV 转换最终会将符号位扩展到高 32 位。

【讨论】:

  • 当我只更改 newSVuv 而没有“UV a =”时,我会得到不同的结果。
  • @sid_com: 啊,如果你有使用 64 位整数的 perl 但“int”是 32 位,你需要两者吗?
【解决方案2】:

int a 可能使用 32 位表示。如果要表示高于 4,294,967,296/2 的值,则应使用 unsigned int

【讨论】:

  • 这无济于事,除非在支持 64 位 int 的 perl 上。
猜你喜欢
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多