my $x = ( 1 << 54 ) | 1;
say $x; # 18014398509481985
$x = unpack 'F', pack 'F', $x;
$x = unpack 'J', pack 'J', $x;
say $x; # 18014398509481984
To support negative numbers, use I instead of J for negative numbers.
The following is a little bit truer to a cast, but it's far more complicated, far more fragile (can fail for overloaded and magical vars), and technically uses XS:
use strict;
use warnings;
use feature qw( say );
use B qw( svref_2object );
my $x = ( 1 << 54 ) | 1;
say $x; # 18014398509481985
# Add the value as an NV to the scalar.
{ no warnings qw( void ); log $x; }
# Make it so the scalar contains just an NV.
$x = svref_2object(\$x)->NV;
# Add the value as an IV or UV to the scalar.
{ no warnings qw( void ); $x | 1; }
# Make it so the scalar contains just an IV or UV.
$x = svref_2object(\$x)->int_value;
say $x; # 18014398509481984