Cos*_*ero 0 perl type-conversion
我有一个设备,它只能使用 Perl以无符号16 位寄存器的形式向我发送数据。
我必须使用 2 个寄存器并从中生成一个 32 位有符号整数。
我的挑战是表示具有两个正值的负值。
方法一:
my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
Run Code Online (Sandbox Code Playgroud)
方法二:
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
Run Code Online (Sandbox Code Playgroud)
例如,
use feature qw( say );
my $hi16 = 0xFFFF;
my $lo16 = 0xFFFD;
say $hi16; # 65535
say $lo16; # 65533
{
my $int32 = unpack("l>", pack("nn", $hi16, $lo16));
say $int32; # -3
}
{
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
say $int32; # -3
}
Run Code Online (Sandbox Code Playgroud)