Ваш вопрос не имеет смысла. Вы просите быстрый способ сделать что-то медленный путь. Если бы мы знали, что вы действительно хотели бы сделать , мы могли бы предложить лучшее решение.
use strict;
use warnings;
use feature qw( say );
use Inline C => <<'__EOS__';
void cast_double_to_uv(SV* sv) {
dXSARGS;
double d = (double)SvNV(sv);
UV uv;
if (sizeof(uv) < sizeof(double))
croak("Integers too small to hold a double.");
if (BYTEORDER == 0x1234) {
/* Little-endian */
memcpy(&uv, &d, sizeof(double));
if (sizeof(uv) > sizeof(double))
memset(((char*)&uv)+sizeof(double), 0, sizeof(double)-sizeof(uv));
} else {
/* Big-endian */
if (sizeof(uv) > sizeof(double))
memset(&uv, 0, sizeof(double)-sizeof(uv));
memcpy(((char*)&uv)+sizeof(double)-sizeof(uv), &d, sizeof(double));
}
XSRETURN_UV(uv);
}
__EOS__
say cast_double_to_uv(5.5);