目錄

名稱

integer - Perl pragma 用於使用整數運算而非浮點運算

語法

use integer;
$x = 10/3;
# $x is now 3, not 3.33333333333333333

說明

這會指示編譯器從這裡到封閉區塊結束處使用整數運算。在許多機器上,這對大多數運算來說影響不大,但在沒有浮點硬體的機器上,這可能會對效能造成重大影響。

請注意,這只會影響大多數算術和關係運算子處理其運算元和結果的方式,並不會影響所有數字的處理方式。特別是,use integer; 會在計算算術運算子(+、-、*、/、%、+=、-=、*=、/=、%= 和一元減號)、比較運算子(<、<=、>、>=、==、!= 和 <=>)和位元運算子(|、&、^、<<、>>、|=、&=、^=、<<= 和 >>=)的結果之前,將運算元的浮點部分截斷(或取整數),而結果的浮點部分也會被截斷。此外,運算元和結果的範圍限制為熟悉的二補數整數,也就是說,在 32 位元架構上為 -(2**31) .. (2**31-1),在 64 位元架構上為 -(2**63) .. (2**63-1)。例如,以下程式碼

use integer;
$x = 5.8;
$y = 2.5;
$z = 2.7;
$a = 2**31 - 1;  # Largest positive integer on 32-bit machines
$, = ", ";
print $x, -$x, $x+$y, $x-$y, $x/$y, $x*$y, $y==$z, $a, $a+1;

會列印:5.8、-5、7、3、2、10、1、2147483647、-2147483648

請注意,由於 $x 未經過運算,因此仍會列印為其真實的非整數值 5.8。另外,請注意從最大的正整數換行到最大的負整數。此外,傳遞給函式的引數和函式傳回的值不受 use integer; 影響。例如:

srand(1.5);
$, = ", ";
print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10);

無論是否使用 use integer;,都會得到相同的結果。冪運算子 ** 也不受影響,因此 2 ** .5 永遠是 2 的平方根。現在,恰巧前置和後置遞增和遞減運算子 ++ 和 -- 也不受 use integer; 影響。有些人可能會正確地認為這是一個錯誤,但至少是一個長期的錯誤。

最後,use integer; 也對按位元運算子有額外的影響。通常,運算元和結果會被視為無符號整數,但使用 use integer; 時,運算元和結果會有符號。這表示,在其他情況下,~0 為 -1,而 -2 & -5 為 -6。

在內部,使用原生整數運算(由 C 編譯器提供)。這表示 Perl 本身對運算運算的語意可能無法保留。一個常見的麻煩來源是負數的模數,Perl 以一種方式執行,但您的硬體可能以另一種方式執行。

% perl -le 'print (4 % -3)'
-2
% perl -Minteger -le 'print (4 % -3)'
1

請參閱 perlmodlib 中的「實用模組」perlop 中的「整數運算」