Perl 体系结构的一元非整数化
从“精通Perl/第16章/位运算符/一元非,~”: 一元NOT运算符(有时称为补码运算符)~,根据体系结构的整数大小返回值的位求反或1的补码 为什么下面的脚本输出两个不同的值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
#!/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在我的答案中添加了一点。