一元NOT / Integersize架构

从“掌握Perl /第16章/位操作符/一元NOT,〜”:   一元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 32
的输出。 使用
Devel::Peek::Dump
,可以看出
$complement
是无符号整数,而
$value
不是。这篇文档表明无符号整数至少为32位,但与平台有关。我只能假设它们的意思是“取决于本地C编译器所谓的'long'而不是int,因为大多数编译器(包括GCC)在64位架构上使用32位整数。     
intsize给出了C'int'的宽度,但“体系结构的整数大小”表示Perl实际将使用的整数大小,这可能取决于它的配置方式。使用
$Config{'ivsize'}
(或uvsize;两者应该是相同的)来查看它有多长(或ivtype / uvtype来查看C类型是什么)。 如果您看到两个长度之间存在差异,则intsize为4,但ivsize为8.您使用的格式为
%32b
,其最小输出宽度为32; $ value仅使用8个字符,因此填充为32,但$ complement使用64个字符。     

要回复问题请先登录注册