Forum und email

Inteiros

Um inteiro é um número do conjunto Z = {..., -2, -1, 0, 1, 2, ...}.

Veja também: Inteiros de tamanho arbitrário / GMP, Números de ponto flutuante e Precisão arbitrária / BCMath.

Sintaxe

Inteiros podem ser especificados em notação decimal (base 10), hexadecimal (base 16) ou octal (base 8), opcionalmente precedido de sinal (- ou +).

Para usar a notação octal, você precisa preceder o número com um 0 (zero). Para utilizar a notação hexadecimal, preceda número com 0x.

Example#1 Literais inteiras

<?php
$a 
1234// número decimal
$a = -123// um número negativo
$a 0123// número octal (equivalente a 83 em decimal)
$a 0x1A// número hexadecimal (equivalente a 26 em decimal)
?>
Formalmente, as possíveis representação de inteiros são:
decimal     : [1-9][0-9]*
            | 0

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

octal       : 0[0-7]+

integer     : [+-]?decimal
            | [+-]?hexadecimal
            | [+-]?octal
O tamanho de um inteiro é dependente de plataforma, sendo um numero aproximado a 2 bilhões o valor mais comum (número de 32 bits com sinal). O PHP não suporta inteiros sem sinal. O tamanho do inteiro pode ser determinado por PHP_INT_SIZE, o valor máximo para PHP_INT_MAX desde o PHP 4.4.0 e PHP 5.0.5.

Aviso

Se um dígito inválido é passado para inteiro octal (i.e. 8 ou 9), o resto do número é ignorado.

Example#2 Octal weirdness

<?php
var_dump
(01090); // 010 octal = 8 decimal
?>

Overflow de inteiros

Se você especifica um número além dos limites do tipo inteiro, ele será interpretado como um ponto flutuante. Assim, se você realizar uma operação que resulte em um número além dos limites do tipo inteiro, um ponto flutuante será retornado também.

<?php
numero_grande =  2147483647;
var_dump($numero_grande);
// saida: int(2147483647)

$numero_grande =  2147483648;
var_dump($numero_grande);
// saida: float(2147483648)

// it's true also for hexadecimal specified integers between 2^31 and 2^32-1:
var_dump0xffffffff );
// output: float(4294967295)

// this doesn't go for hexadecimal specified integers above 2^32-1:
var_dump0x100000000 );
// output: int(2147483647)

$milhao 1000000;
$numero_grande =  50000 $milhao;
var_dump($numero_grande);
// saida: float(50000000000)
?>
Aviso

Infelizmente, há um bug no PHP que faz que ele nem sempre trabalhe corretamente quando há números negativos envolvidos. Por exemplo, quando você faz -50000 * $milhao, o resultado será -429496728. Entretanto, quando ambos os operadores são positivos, isso não ocorre.

Isto foi resolvido no PHP 4.1.0.

Não há operador de divisão inteira no PHP. 1/2 retorna o ponto flutuante 0.5. Você pode moldar (cast) o valor para inteiro para sempre truncar o número, ou você pode usar a função round().

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

Convertendo para inteiro

Para converter explicitamente um valor para inteiro, utilize-se dos modificadores (int) ou (integer). Entretanto, na maioria dos casos, você não precisa utilizar o modificador, desde que qualquer valor será automaticamente convertido se um operador, função ou estrutura de controle requerer um argumento inteiro. Você também pode converter o valor de um inteiro com a função intval().

Veja também Manipulação de tipos.

de booleanos

FALSE será retornado como 0 (zero), e TRUE como 1 (um).

De números de ponto flutuante

Quando convertendo de números de ponto flutuante para inteiros, o número será truncado.

Se o número convertido estiver além dos limites de um inteiro (usualmente +/- 2.15e+9 = 2^31), o resultado é indefinido, mesmo porque o ponto flutuante não tem a mesma precisão para fornecer um resultado inteiro exato. Não se preocupe, pois nenhum aviso será emitido neste caso!

Aviso

Nunca modifique uma fração desconhecida para inteiro, porque isto pode fornecer resultados inesperados as vezes.

<?php
echo (int) ( (0.1+0.7) * 10 ); // imprime 7!
?>
Para maiores informações, veja o alerta sobre a precisão de número flutuante..

De outros tipos

Cuidado

O comportamento da conversão de um inteiro é indefinido de outros tipos. Atualmente, o comportamento é o mesmo como se primeiro o valor fosse convertido para booleano. Entretanto, não confie neste comportamento, pois ele pode mudar sem aviso.