Forum und email

Integers (Ακέραιοι)

Ένας integer είναι ένας αριθμός του συνόλου Z = {..., -2, -1, 0, 1, 2, ...}.

Δείτε επίσης: Ακέραιοι αυθαίρετου μεγέθους / GMP, Αριθμού κινητής υποδιαστολής, και Αυθαίρετη ακρίβεια / BCMath

Σύνταξη

Οι ακέραιοι μπορούν να καθοριστούν στο δεκαδικό (με βάση το 10), δεκαεξαδικό (με βάση το 16) ή οκταδικό (με βάση το 8) σύστημα, και προαιρετικά μπορεί να προστεθεί το πρόσημο (- ή +).

Αν χρησιμοποιείτε το οκταδικό σύστημα, πρέπει να γράφετε πριν το αριθμό το 0 (μηδέν), και αν χρησιμοποιείτε το δεκαεξαδικό πρέπει να γράφετε πριν τον αριθμό το 0x.

Example#1 Integer literals (Λεκτικά ακεραίων)

<?php
$a 
1234# decimal number
$a = -123# a negative number
$a 0123# octal number (equivalent to 83 decimal)
$a 0x1A# hexadecimal number (equivalent to 26 decimal)
?>
Επισήμως, η πιθανή δομή για τα λεκτικά ακεραίων είναι:
<?php
decimal     : [1-9][0-9]*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+

octal       : 0[0-7]+

integer     : [+-]?decimal
            | [+-]?hexadecimal
            | [+-]?octal
?>
Το μέγεθος του ακεραίου εξαρτάται από την πλατφόρμα, ενώ μια μέγιστη τιμή περίπου 2 δισεκατομμυρίων είναι η συνηθισμένη τιμή (δηλαδή 32 bits προσημασμένα). Η PHP δεν υποστηρίζει μη προσημασμένους ακεραίους.

Υπερχείλιση ακεραίων (Integer overflow)

Αν προσδιορίσετε έναν αριθμός εκτός των ορίων του τύπου integer, θα διερμηνευτεί ως float (κινητής υποδιαστολής). Επίσης, αν κάνετε μια πράξη το αποτέλεσμα της οποίας δίνει αριθμό πέρα από τα όρια του τύπου integer, θα επιστραφεί αριθμός τύπου float (κινητής υποδιαστολής).

<?php
$large_number 
=  2147483647;
var_dump($large_number);
// output: int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)

// this goes also for hexadecimal specified integers:
var_dump0x80000000 );
// output: float(2147483648)

$million 1000000;
$large_number =  50000 $million;
var_dump($large_number);
// output: float(50000000000)
?>
Warning

Δυστυχώς, υπήρχε ένα bug στην PHP με αποτέλεσμα αυτό να μην λειτουργεί παντα σωστά όταν υπάρχουν αρνητικοί αριθμοί. Για παράδειγμα: όταν κάνετε -50000 * $million, το αποτέλεσμα θα είναι -429496728. Σε περίπτωση βέβαια που και οι δυο τελεστές είναι θετικοί δεν υπάρχει πρόβλημα.

Αυτό λύθηκε στην PHP 4.1.0.

Δεν υπάρχει τελεστής διαίρεσης στην PHP. Το 1/2 μετατρέπεται στον αριθμό float 0.5. Μπορείτε να μετατρέψετε την τιμή σε ακέραιο να το στρογγυλοποιήσετε προς τα κάτω, ή να χρησιμοποιήσετε τη συνάρτηση round() .

<?php
var_dump
(25/7);         // float(3.5714285714286) 
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7));  // float(4) 
?>

Μετατρέποντας σε ακέραιο

Για να μετατρέψετε ρητά μια τιμή σε integer, χρησιμοποιήστε είτε το (int) είτε το (integer) για τη μετατροπή (cast). Πάντως, στις περισσότερες περιπτώσεις δεν χρειάζεται να χρησιμοποιήσετε την cast, αφού η τιμή θα μετατραπεί αυτόματα αν ένας τελεστής, μια συνάρτηση ή μια δομή ελέγχου απαιτεί μια παράμετρο τύπου integer . Μπορείτε επίσης να μετατρέψετε μια τιμή σε ακέραιο μέσα στη συνάρτηση intval().

Δείτε επίσης type-juggling.

Από booleans

FALSE θα προκύψει 0 (μηδέν), και από TRUE θα προκύψει 1 (ένα).

Από αριθμούς κινητής υποδιαστολής

Όταν γίνεται μετατροπή από αριθμού κινητής υποδιαστολής σε ακέραιο, ο αριθμός θα στρογγυλευτεί προς το μηδέν.

Αν ο αριθμός κινητής υποδιαστολής είναι εκτός των ορίων του ακεραίου (συνήθως +/- 2.15e+9 = 2^31), το αποτέλεσμα είναι απροσδιόριστο, αφού ο αριθμός κινητής υποδιαστολής δεν έχει αρκετή ακρίβεια για να δώσει ένα ακριβές ακέραιο αποτέλεσμα. Καμιά προειδοποίηση, ούτε κάποια άλλη υπενθύμιση γίνεται σε τέτοιες περιπτώσεις!

Warning

Ποτέ μην αλλάζετε τον τύπο μιας παράστασης σε integer, αφού αυτό μπορεί μερικές φορές να οδηγήσει σε μη αναμενόμενα αποτελέσματα.

<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>
Για περισσότερες πληροφορίες δείτε σχετικά με τιςπροειδοποιήσεις για την ακρίβεια αριθμών κινητής υποδιαστολής.

Από άλλους τύπους

Caution

Ο τρόπος με τον οποίο γίνεται η μετατροπή σε ακέραιο δεν είναι καθορισμένος για άλλους τύπους. Προς το παρόν, η μετατροπή γίνεται θεωρώντας ότι η τιμή πρώτα μετατρέπεται σε boolean. Πάντως, μην βασίζεστε σε αυτόν τον τρόπο, αφού μπορεί να αλλάξει χωρίς προειδοποίηση.