我有一个设备只能使用Perl将数据作为无符号 16位寄存器发送给我。
我必须从2个寄存器中取出32位签名的整数。
我的挑战是表示具有两个正面的负值。
答案 0 :(得分:3)
方法1:
my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法2:
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
例如,
$ perl -e'
use feature qw( say );
my $hi16 = 0xFFFF;
my $lo16 = 0xFFFD;
say $hi16;
say $lo16;
{
my $int32 = unpack("l>", pack("nn", $hi16, $lo16));
say $int32;
}
{
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
say $int32;
}
'
65535
65533
-3
-3