我想输出4字节有符号整数类型的值

时间:2017-09-04 08:52:27

标签: perl integer

我使用的是Perl脚本。

我想使用32字节有符号整数形式,如c语言。

例如,如果我将1加到整数值,我想输出它,如下所示。

my $val = 0;
while(1){
   print $val++;
}
-------------------------------
The desired result.
0
1
2

.
.
.
2,147,483,646
2,147,483,647
-2,147,483,648
-2,147,483,647
-2,147,483,647
.
.
.

但我不知道如何使用4byte有符号整数值。

2 个答案:

答案 0 :(得分:2)

你不能告诉Perl你想要使用的整数大小。 [1]

但这似乎并不是你想要的。您似乎想要一个从2,147,483,647-2,147,483,648包裹的计数器。

你必须像在C中那样做:

int32_t i = 0;
...
/* Can't use use ++i because incrementing 2147483647 is undefined behaviour */
i = i == 2147483647 ? -2147483648 : i+1;

int32_t i = 0;
...
/* Can't use use ++i because incrementing 2147483647 is undefined behaviour */
i = (int32_t)((((int64_t)i)+1) & 0xFFFFFFFF);
  1. Perl使用三种数字存储类型:

    • 大小为ivsize
    • 的有符号整数
    • 大小为uvsize
    • 的无符号整数
    • 大小为nvsize
    • 的浮点数

    您可以按如下方式获取每种类型的大小(以字节为单位):

    perl -le'use Config qw( %Config ); print $Config{ivsize};'
    perl -le'use Config qw( %Config ); print $Config{uvsize};'
    perl -le'use Config qw( %Config ); print $Config{nvsize};'
    

    perl -V:ivsize
    perl -V:uvsize
    perl -V:nvsize
    

    编译perl时,不仅固定了这些类型的大小,而且您无法选择perl中哪些类型用于存储值。此外,当发生溢出时,perl将自动从一种类型转换为另一种类型。 (Example

答案 1 :(得分:1)

您可以使用pack / unpack来实现此目的。将您的变量打包到unsigned int,然后将其解压缩到signed int

my $val = 2147483646;
for(my $i=0;$i<4;$i++){
   my $uint = pack('I', $val++); 
   print unpack('i', $uint);
}

请注意:

  

(这个'整数'是_at_least_ 32位宽。确切地说             size取决于本地C编译器调用'int'的内容。)

所以最好使用NV代替I

ideone demo