如何在 Perl 中将 2 个无符号 16 位整数转换为有符号 32 位整数

Cos*_*ero 0 perl type-conversion

我有一个设备,它只能使用 Perl以无符号16 位寄存器的形式向我发送数据。

我必须使用 2 个寄存器并从中生成一个 32 位有符号整数。

我的挑战是表示具有两个正值的负值。

ike*_*ami 5

方法一:

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)

  • `-E` 不向前兼容。由于它启用了所有功能,因此当前在“-E”下运行的代码可能无法在更高版本的 Perl 上运行。 (3认同)