Inteiros com PHP

Comentários desativados 16 janeiro 2010

 

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.

<?php
//exemplo de literais inteiras
$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 número 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 pela constante PHP_INT_SIZE, e seu o valor máximo com a constante 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.

<?php
//Octal weirdness
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, uma operação que resulte em um número além dos limites do tipo inteiro, um ponto flutuante será retornado.


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

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

// é válido também para inteiros hexadecimais entre 2^31 e 2^32-1:
var_dump( 0xffffffff );
// output: float(4294967295)

// porém não é válido para hexadecimais com valores acima de 2^32-1:
var_dump( 0x100000000 );
// 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!
?>

De strings

Veja Conversão de strings para números

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.

Me siga no Twitter para ser informado das novidades do blog.

Leia Também

Tags: , , , , , , , , , , , ,

- escreveu 359 artigos em Brasil PHP.

Sou administrador de empresas, programador PHP, desenvolvedor web, marketeiro digital e me considero um problogger. Sou o editor do Brasil PHP e meu principal objetivo é levar conteúdos únicos e altamente relevantes para os leitores do blog. Aqui são abordados assuntos como criação de sites, monetização, programação PHP, SEO, Guias Comerciais, Classificados etc.

Entre em contato com o autor

Comentários não são permitidos.




Comentadores

© 2009/2012 Brasil PHP - Feito com Wordpress - Política de Privacidade -

Tema por Woo Themes