1 - Tipos inteiros
Um tipo integer representa um sub-conjunto de números inteiros. Os tipos inteiros genéricos são Integer e Cardinal. Devemos usar estes dois tipos sempre que possível, visto que eles resultam na melhor performance para o CPU atual e o sistema operacional. Veja abaixo uma lista de tipos inteiros, suas faixas de valores e formato de armazenamento para um compilador Delphi de 32 bits.
1.1 - Tipos inteiros genéricos para a implementação 32-bit do Delphi
Integer
-2147483648..2147483647
32 bits com sinal
Cardinal
0..4294967295
32 bits sem sinal
1.2 - Tipos inteiros fundamentais
Shortint
-128..127 8 bits com sinal
Smallint
-32768..32767
16 bits com sinal Longint -2147483648..2147483647 32 bits com sinal Int64 -2^63..2^63-1 64 bits com sinal Byte 0..255 8 bits sem sinal Word 0..65535 16 bits sem sinal Longword 0..4294967295 32 bits sem sinal
Em geral as operações aritméticas envolvendo tipos inteiros retornam um valor do tipo Integer, o qual, em sua implementação atual é equivalente ao tipo Longint de 32 bits. As operações retornam um valor do tipo Int64 somente quando um ou mais operandos forem do tipo Int64. Assim, o trecho de código abaixo não produz o resultado esperado:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Integer;
J: Int64;
begin
I := High(Integer)*
J := I + 1;
ShowMessage(IntToSTr(J))*
end;
O resultado exibido será -2147483648, ou seja, houve um estouro da capacidade máxima positiva de um Integer. Mas, como J é do tipo Int64, é de se esperar que o valor fosse 2147483648. Para que isso aconteça, temos que fazer um cast em pelo menos um dos valores envolvidos para o tipo Int64. Veja:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Integer;
J: Int64;
begin
I := High(Integer)*
J := Int64(I) + 1;
ShowMessage(IntToSTr(J))*
end;
Agora sim, o resultado será 2147483648.
Importante:
Algumas rotinas padrões que aceitam argumentos Integer truncam valores Int64 para 32 bits. Contudo, as funções High(), Low(), Succ(), Pred(), Inc(), Dec(), IntToStr() e IntToHex() suportam argumentos Int64. Além disso, as funções Round(), Trunc(), StrToInt64() e StrToInt64Def() retornam valores do tipo Int64. Mas lembre-se: algumas rotinas Delphi não aceitam valores Int64 de forma alguma.
Quando incrementamos o último valores ou decrementamos o primeiro valor em um tipo inteiro, o resultado varia entre o início e fim da faixa. Por exemplo, o tipo Shortint tem a faixa -128..127. Desta forma, depois de executarmos o código:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Shortint;
begin
I := High(Shortint)*
I := I + 1;
ShowMessage(IntToStr(I))*
end;
O valor da variável I é -128. Se habilitarmos a diretiva range-checking do compilador, este código gerará um erro de runtime.
Um tipo integer representa um sub-conjunto de números inteiros. Os tipos inteiros genéricos são Integer e Cardinal. Devemos usar estes dois tipos sempre que possível, visto que eles resultam na melhor performance para o CPU atual e o sistema operacional. Veja abaixo uma lista de tipos inteiros, suas faixas de valores e formato de armazenamento para um compilador Delphi de 32 bits.
1.1 - Tipos inteiros genéricos para a implementação 32-bit do Delphi
Tipo
Faixa de valores
Formato
Faixa de valores
Formato
Integer
-2147483648..2147483647
32 bits com sinal
Cardinal
0..4294967295
32 bits sem sinal
1.2 - Tipos inteiros fundamentais
Tipo
Faixa de valores
Formato
Faixa de valores
Formato
Shortint
-128..127 8 bits com sinal
Smallint
-32768..32767
16 bits com sinal Longint -2147483648..2147483647 32 bits com sinal Int64 -2^63..2^63-1 64 bits com sinal Byte 0..255 8 bits sem sinal Word 0..65535 16 bits sem sinal Longword 0..4294967295 32 bits sem sinal
Em geral as operações aritméticas envolvendo tipos inteiros retornam um valor do tipo Integer, o qual, em sua implementação atual é equivalente ao tipo Longint de 32 bits. As operações retornam um valor do tipo Int64 somente quando um ou mais operandos forem do tipo Int64. Assim, o trecho de código abaixo não produz o resultado esperado:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Integer;
J: Int64;
begin
I := High(Integer)*
J := I + 1;
ShowMessage(IntToSTr(J))*
end;
O resultado exibido será -2147483648, ou seja, houve um estouro da capacidade máxima positiva de um Integer. Mas, como J é do tipo Int64, é de se esperar que o valor fosse 2147483648. Para que isso aconteça, temos que fazer um cast em pelo menos um dos valores envolvidos para o tipo Int64. Veja:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Integer;
J: Int64;
begin
I := High(Integer)*
J := Int64(I) + 1;
ShowMessage(IntToSTr(J))*
end;
Agora sim, o resultado será 2147483648.
Importante:
Algumas rotinas padrões que aceitam argumentos Integer truncam valores Int64 para 32 bits. Contudo, as funções High(), Low(), Succ(), Pred(), Inc(), Dec(), IntToStr() e IntToHex() suportam argumentos Int64. Além disso, as funções Round(), Trunc(), StrToInt64() e StrToInt64Def() retornam valores do tipo Int64. Mas lembre-se: algumas rotinas Delphi não aceitam valores Int64 de forma alguma.
Quando incrementamos o último valores ou decrementamos o primeiro valor em um tipo inteiro, o resultado varia entre o início e fim da faixa. Por exemplo, o tipo Shortint tem a faixa -128..127. Desta forma, depois de executarmos o código:
procedure TForm3.Button2Click(Sender: TObject)*
var
I: Shortint;
begin
I := High(Shortint)*
I := I + 1;
ShowMessage(IntToStr(I))*
end;
O valor da variável I é -128. Se habilitarmos a diretiva range-checking do compilador, este código gerará um erro de runtime.