在PHP中,我們經常會遇到unsigned(無符號)這個詞。那么,它到底是什么意思呢?
在計算機中,有signed和unsigned兩種類型。signed 表示有符號類型,可表示正整數、負整數和零;unsigned則表示無符號類型,只能表示非負整數(即正整數和零)。
在PHP中,我們可以用如下方式來定義一個 unsigned 類型的整數:
$a = 12345; // signed $b = ~0; // unsigned $c = 0xffffffff; // unsigned
其中,在 $b 和 $c 定義中,我們可以看到 ~0 和 0xffffffff 這兩個數,它們實際上分別表示了二進制中所有位都為 1 的有符號數和無符號數,而在 PHP 中, ~0 和 0xffffffff 在內存中的二進制存儲是一模一樣的。
下面我們先看一個例子,比較一下使用有符號類型和無符號類型時的不同:
$num1 = -12; $num2 = 244; echo "num1=$num1, num2=$num2\n\n"; $sum = $num1 + $num2; echo "sum=$sum\n\n";
這段代碼中,$num1 和 $num2 分別表示有符號類型和無符號類型。
我們可以看出,使用有符號數和無符號數時,它們所能表示的數值范圍是不同的。例如,一個 8 位的 unsigned 變量最大可以表示 0xff(即 255),而 8 位的 signed 變量最大只能表示 0x7f(即 127)。
另外,在計算時,有符號數和無符號數也有明顯區別。在使用有符號數時,如果兩個數的和超出了所能表示的范圍,那么結果就會溢出(根據溢出規則)。
例如,在上面的代碼中,使用有符號數時,$num1 和 $num2 比較時會自動轉換成無符號數,然后再進行計算。由于 $num1 是負數,因此會轉換成一個很大的正數(在 32 位機器上是 4294967284)。這樣,當它和 $num2 相加時,會發生溢出,結果會變成一個很小的負數(在 32 位機器上是 -24)。
如果我們在定義變量時將其類型設為 unsigned,則結果將會不同,因為在使用 unsigned 類型時,溢出不會產生負數。在上面的例子中,如果我們將 $num1 定義成無符號數,則得到的結果是:
$num1 = 4294967284; $num2 = 244; echo "num1=$num1, num2=$num2\n\n"; $sum = $num1 + $num2; echo "sum=$sum\n\n";
這段代碼中,$num1 的值變成了無符號數 4294967284,這是因為在使用無符號數進行比較時,它們會被轉換成無符號數。在這種情況下,$num1 和 $num2 相加時,不會發生溢出,而是會得到一個正確的結果 228。
總之,unsigned 類型的變量無法表示負數,但可以表示更大的正整數。在進行計算時,有符號數和無符號數的結果也會有所不同。因此,我們需要在使用它們時特別注意。