この型は、Perl ディストリビューションに付属するuint64_t
default では定義されていません。typemap
によるとperlxstypemap
:
xsubpp
より実用的な用語では、typemap は、 C 関数のパラメーターと値を Perl の値にマップするためにコンパイラーによって使用されるコードフラグメントのコレクションです。
独自に定義できますtypemap
(ファイルと同じディレクトリに.xs
)。次のようになります。
TYPEMAP
unsigned long long T_U_LONG_LONG
uint64_t T_U_LONG_LONG # equivalent to typedef unsigned long long uint64_t;
INPUT
T_U_LONG_LONG
$var = (unsigned long long)SvUV($arg)
OUTPUT
T_U_LONG_LONG
sv_setuv($arg, (UV)$var);
SvUV
これらのマッピングについては、特に部分的に確信が持てないUV
ため、実際のコードで慎重にテストする必要があります。それらは単なる「プレーンな」整数であると思われるuint64_t
ため、内部使用、つまり関数の定義内でのみ完全に機能します。
C標準(C99以降)によると、unsigned long long
型は少なくとも64ビット幅ですが、私が知っているすべての実装で64ビットであることに注意してください。
次のようにtest.xs
:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
MODULE = test PACKAGE = test
unsigned int
u64_mul_high(a, b)
unsigned int a
unsigned int b
CODE:
RETVAL = ((uint64_t) a * b) >> 32;
OUTPUT:
RETVAL
次のようにtest.pl
定義されます。
#!/usr/bin/perl
use ExtUtils::testlib;
use test;
print test::u64_mul_high(2147483647, 1000), "\n";
次の結果が得られます。
499 (0001 1111 0011)
32-bit x 32-bit
これは、結果が 64 ビット整数になる乗算の上位 32 ビット リムです。
これを 32 ビット GNU/Linuxsizeof(long) = 4
と Perl 5.10 で確認しました。