Унарное НЕ / Целостный размер архитектуры - PullRequest
3 голосов
/ 31 декабря 2010

Из "Мастеринг Perl / Глава 16 / Битовые операторы / Унарное НЕ, ~":

Унарный оператор НЕ (иногда называемый оператором дополнения), ~, возвращает побитовое отрицание или 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

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

intsize дает ширину C 'int', но "целочисленный размер архитектуры" означает размер целого числа, который фактически будет использовать Perl, который может зависеть от того, как он был сконфигурирован.Используйте $Config{'ivsize'} (или uvsize; оба должны быть одинаковыми), чтобы увидеть, как долго это (или ivtype / uvtype, чтобы увидеть, какой тип C).

Где вы видите разницу междудве длины, intsize равно 4, а ivsize равно 8. Вы используете формат %32b, который устанавливает минимальную ширину вывода 32;$ value использует только 8 символов, поэтому дополняется до 32, но $ дополнение использует 64 символа.

2 голосов
/ 31 декабря 2010

Ключевая фраза «основана на целочисленном размере архитектуры».Вы используете это на 64-битной архитектуре, поэтому дополнение будет возвращено как 64-битное целое число.Выполнение кода в 32-битной архитектуре приводит к выводу 32 32.

Используя Devel::Peek::Dump, вы можете видеть, что $complement является целым числом без знака, тогда как $value - нет. Этот фрагмент документации указывает, что целые числа без знака являются по крайней мере 32-разрядными, но зависят от платформы.Я могу только предположить, что они имели в виду «зависит от того, что локальный компилятор C называет« long »», а не от int, так как большинство компиляторов (включая GCC) используют 32-битные числа в 64-битной архитектуре.

...