Bir int türünde değer şu kümeden bir tamsayıdır: ℤ = {..., -2, -1, 0, 1, 2, ...}.
int türünde değerler onluk, sekizlik veya onaltılık tabanda belirtilebilirler. değil işleci negatif bir int belirtmekte kullanılabilir.
Sekizlik gösterimde sayıların önüne 0
(sıfır),
onaltılık gösterimde 0x
ve ikil gösterimde
0b
getirilir.
PHP 8.1.0 ve sonrasında sekizlik gösterim ayrıca, 0o
veya 0O
ile öncelenmiş de olabilir.
PHP 7.4.0'dan itibaren, tamsayı değişmezleri, değişmez değerlerin daha
iyi okunabilirliği için rakamlar arasında alt çizgi (_
)
içerebilir. Bu alt çizgiler PHP'nin tarayıcısı tarafından kaldırılır.
Örnek 1 - Tamsayı değişmezler
<?php
$a = 1234; // onluk sayı
$a = -123; // negatif sayı
$a = 0123; // sekizlik sayı (onluk: 83)
$a = 0o123; // sekizlik sayı (PHP 8.1.0 ve sonrası)
$a = 0x1A; // onaltılık sayı (onluk: 26)
$a = 0b11111111; // ikil sayı (onluk: 255)
$a = 1_234.567; // onluk sayı (PHP 7.4.0 ve sonrası)
?>
PHP 8.1.0'dan itibaren, biçimsel olarak, int değişmezlerinin yapısı
(evvelce, 0o
ve 0O
sekizlik
öneklerine ve PHP 7.4.0'dan önce alt çizgilere izin verilmezdi):
onluk : [1-9][0-9]*(_[0-9]+)* | 0 onaltılık : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* sekizlik : 0[oO]?[0-7]+(_[0-7]+)* ikil : 0[bB][01]+(_[01]+)* tamsayı : onluk | onaltılık | sekizlik | ikil
Bir intr türün genişliği platforma göre değişir. 32 bitlik
sistemlerde azami değer 2 milyon civarında iken 64 bitlik sistemlerde 9E18
civarındadır. PHP işaretsiz tamsayıları (C'deki unsigned) desteklemez.
int türün genişliği PHP_INT_SIZE
sabitine, olası en büyük değeri PHP_INT_MAX
sabitine ve en küçük değeri ise PHP_INT_MIN
sabitine atanmıştır.
PHP, int türünde bir değerin bellekte int türüne ayrılan genişliğe sığmadığını saptarsa float türünde bir değer olarak ele alır ve bu durum yapılan bir işlem sırasında ortaya çıkmışsa işlemden dönen değer float türünde olur.
Örnek 2 - 32 bitlik sistemlerde tamsayı taşması
<?php
$büyük_sayı = 2147483647;
var_dump($büyük_sayı);
$büyük_sayı = 2147483648;
var_dump($büyük_sayı);
$milyon = 1000000;
$büyük_sayı = 50000 * $million;
var_dump($büyük_sayı);
?>
Örnek 3 64 bitlik sistemlerde tamsayı taşması
<?php
$büyük_sayı = 9223372036854775807;
var_dump($büyük_sayı); // int(9223372036854775807)
$büyük_sayı = 9223372036854775808;
var_dump($büyük_sayı); // float(9.2233720368548E+18)
$milyon = 1000000;
$büyük_sayı= 50000000000000 * $milyon;
var_dump($büyük_sayı); // float(5.0E+19)
?>
PHP'de sonucun int türünde elde edileceği bir bölme
işleci mevcut değildir, bunu sağlamak için intdiv()
işlevini kullanın. 1/2
işleminin sonucu
float türünde 0.5
değeridir. Bu değer
(int) ile çarpıtılarak sıfıra yuvarlamak suretiyle bir
tamsayıya dönüştürülebilirse de round() işlevini
kullanırsanız dönüşümün nasıl yapılacağını kendiniz belirleyebilirsiniz.
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
int
türüne dönüşüm
Bir değeri doğrudan int türüne dönüştürmek için
(int)
veya (integer)
çarpıtmasını
kullanabilirsiniz. Ancak, çoğu durumda türü çarpıtmak gerekmez, bir
int değer gerektiren bir işlev veya denetim yapısı, değeri
kendiliğinden int türüne dönüştürecektir. Ayrıca, bir değer
int türüne intval() işleviyle de
dönüştürülebilir.
Bir resource bir inte sayıya dönüştürülürse, sonuç, PHP tarafından çalışma anında özkaynağa atanan eşsiz özkaynak numarası olacaktır.
Ayrıca, Tür Dönüşümü bölümüne de bakınız.
float
türünden dönüşümfloat türünden int türüne dönüşümde sayı sıfıra yaklaştırılarak yuvarlanır. PHP 8.1.0 ve sonrasında, örtük dönüşümdeki hassasiyet kaybından dolayı işlemin önerilmediğini belirten bir uyarı çıktılanmaktadır.
<?php
function foo($value): int {
return $value;
}
var_dump(foo(8.1)); // "Önerilmiyor: float 8.1 değerin int türüne örtük
// olarak dönüştürülmesi hassasiyet kaybı oluşturduğundan PHP 8.1.0 ve
// sonrasında önerilmemektedir.
var_dump(foo(8.1)); // PHP 8.1.0 öncesinde 8
var_dump(foo(8.0)); // Her iki durumda 8
var_dump((int)8.1); // Her iki durumda 8
var_dump(intval(8.1)); // Her iki durumda 8
?>
Dönüşüm sonucu int türüne ayrılan genişliğe (normalde
32 bitlik sistemlerde +/- 2.15e+9 = 2^31
,
64 bitlik sistemlerde ise +/- 9.22e+18 = 2^63
)
sığmıyorsa, float türün hassasiyeti int türünde
tam bir sonuç vermeyeceğinden sonuç tanımsızdır. Bu durumda ne bir uyarı
ne de bir bilgi verilir!
Bilginize:
int türüne çarpıtıldığında NaN ve Infinity daima sıfır olacaktır.
Ondalık kısmı int türüne asla dönüştürmeyin, yoksa beklenmedik sonuçlar elde edebilirsiniz.
<?php
echo (int) ( (0.1+0.7) * 10 ); // çıktısı: 7!
?>
Ayrıca bakınız: Kayan noktalı sayılarda hassasiyet uyarısı.
Dize sayısal
veya öncü sayısal ise, karşılık gelen tamsayı değerine çözümlenir,
aksi takdirde sıfıra (0
) dönüştürülür.
Diğer türlerden int türüne dönüşümün nasıl davranacağı henüz kesin olarak tanımlanmamıştır. Gözlemlediğiniz bir davranışın doğruluğuna güvenmeyiniz, ileride bu davranış hiçbir bilgi verilmeden değiştirilebilir.