3

「Mastering Perl/Chapter 16/Bit Operators/単項NOT,~」より:

単項 NOT 演算子 (補数演算子と呼ばれることもあります) ~ は、アーキテクチャの整数サイズに基づいて、値のビットごとの否定または 1 の補数を返します。

次のスクリプトが 2 つの異なる値を出力するのはなぜですか?

#!/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
4

2 に答える 2

3

intsize は C の 'int' の幅を示しますが、「アーキテクチャの整数サイズ」は、Perl が実際に使用する整数のサイズを意味し、構成方法に依存する可能性があります。$Config{'ivsize'}(または uvsize; 2 つは同じである必要があります) を使用して、その長さを確認します (または ivtype/uvtype を使用して、C タイプが何であるかを確認します) 。

2 つの長さの違いが見られる場合、intsize は 4 ですが、ivsize は 8 です。%32b最小出力幅を 32 に設定する形式を使用しています。$value は 8 文字しか使用しないため、32 にパディングされますが、$complement は 64 文字を使用します。

于 2010-12-31T14:38:52.383 に答える
2

キーワードは「アーキテクチャの整数サイズに基づく」です。これを 64 ビット アーキテクチャで実行しているため、補数は 64 ビット整数として返されます。32 ビット アーキテクチャでコードを実行すると、32 32.

を使用すると、 が符号なし整数であるのに対し、そうではないDevel::Peek::Dumpことがわかります。このドキュメントは、符号なし整数が少なくとも 32 ビットであるが、プラットフォームに依存することを示しています。ほとんどのコンパイラ(GCCを含む)は64ビットアーキテクチャで32ビットintを使用するため、intではなく「ローカルCコンパイラが「 long 」と呼ぶものに依存する」ことを意味しているとしか思えません。$complement$value

于 2010-12-31T08:17:18.853 に答える