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