Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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 体系结构的一元非整数化_Perl_Int_Bitwise Operators_Cpu Architecture_Unary Operator - Fatal编程技术网

Perl 体系结构的一元非整数化

Perl 体系结构的一元非整数化,perl,int,bitwise-operators,cpu-architecture,unary-operator,Perl,Int,Bitwise Operators,Cpu Architecture,Unary Operator,从“精通Perl/第16章/位运算符/一元非,~”: 一元NOT运算符(有时称为补码运算符)~,根据体系结构的整数大小返回值的位求反或1的补码 为什么下面的脚本输出两个不同的值 #!/usr/local/bin/perl use warnings; use 5.012; use Config; my $int_size = $Config{intsize} * 8; my $value = 0b1111_1111; my $complement = ~ $value; say length

从“精通Perl/第16章/位运算符/一元非,~”:

一元NOT运算符(有时称为补码运算符)~,根据体系结构的整数大小返回值的位求反或1的补码

为什么下面的脚本输出两个不同的值

#!/usr/local/bin/perl
use warnings;
use 5.012;
use Config;

my $int_size = $Config{intsize} * 8;

my $value = 0b1111_1111;
my $complement = ~ $value;

say length sprintf "%${int_size}b", $value;
say length sprintf "%${int_size}b", $complement;
输出:

32  
64
关键短语是“基于架构的整数大小”。您在64位体系结构上运行此操作,因此补码将作为64位整数返回。在32位体系结构上运行代码会产生
32
的输出


使用
Devel::Peek::Dump
,可以看到
$complete
是无符号整数,而
$value
不是。指示无符号整数至少为32位,但取决于平台。我只能假设它们的意思是“取决于本地C编译器调用‘long’的内容”,而不是int,因为大多数编译器(包括GCC)在64位体系结构上使用32位int。

intsize给出了C‘int’的宽度,但“体系结构的整数大小”表示Perl实际将使用的整数的大小,这取决于它是如何配置的。使用
$Config{'ivsize'}
(或uvsize;两者应该相同)查看长度(或使用ivtype/uvtype查看C类型是什么)


当您看到两个长度之间的差异时,intsize是4,而ivsize是8。您使用的格式是
%32b
,它将最小输出宽度设置为32$value只使用8个字符,因此被填充为32个字符,但是$complete使用64个字符。

您还知道为什么第一个表达式只有32位宽吗?@Roland在我的答案中添加了一点。