Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中将2个无符号16位整数转换为有符号32位整数_Perl_Type Conversion - Fatal编程技术网

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

如何在Perl中将2个无符号16位整数转换为有符号32位整数,perl,type-conversion,Perl,Type Conversion,我有一个设备,它只能使用Perl以无符号16位寄存器的形式向我发送数据 我必须取2个寄存器,并从中生成一个32位有符号整数 我的挑战是表示一个有两个正值的负值。方法1: my $int32 = unpack('l>', pack('nn', $hi16, $lo16)); 方法2: my $int32 = ( $hi16 << 16 ) | $lo16; $int32 -= 2**32 if $int32 >= 2**31; my$int32=($hi16=2**31

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

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

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

方法1:

my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法2:

my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
my$int32=($hi16=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
$perl-e'
使用特征qw(例如);
my$hi16=0xFFFF;
my$lo16=0xFFFD;
比如说$hi16;
比如16美元;
{
my$int32=解包(“l>”,打包(“nn”,$hi16,$lo16));
比如说$int32;
}
{
my$int32=($hi16=2**31;
比如说$int32;
}
'
65535
65533
-3
-3
方法1:

my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法2:

my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
my$int32=($hi16=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
$perl-e'
使用特征qw(例如);
my$hi16=0xFFFF;
my$lo16=0xFFFD;
比如说$hi16;
比如16美元;
{
my$int32=解包(“l>”,打包(“nn”,$hi16,$lo16));
比如说$int32;
}
{
my$int32=($hi16=2**31;
比如说$int32;
}
'
65535
65533
-3
-3

Use-pack/unpack/unpack如果使用
-E
命令行开关而不是
-E
-E
则不必使用
CORE::say
,因为它启用了所有功能,所以当前在
-E
下运行的代码可能不会出现在更高版本的Perl上。您不必使用
CORE::say
如果使用
-E
命令行开关而不是
-E
-E
是不向前兼容的。由于它启用了所有功能,当前在
-E
下运行的代码可能不会在更高版本的Perl上运行。