Estou fazendo a transição do Java para o C ++ e tenho algumas perguntas sobre o long
tipo de dados. Em Java, para armazenar um número inteiro maior que 2 32 , você simplesmente escreverialong x;
. No entanto, em C ++, parece que long
é um tipo de dados e um modificador.
Parece haver várias maneiras de usar long
:
long x;
long long x;
long int x;
long long int x;
Além disso, parece que existem coisas como:
long double x;
e assim por diante.
Qual é a diferença entre todos esses tipos de dados e todos eles têm o mesmo objetivo?
c++
long-integer
1110101001
fonte
fonte
long long
pode ser mais lento quelong
, o que pode ser mais lento queint
.Respostas:
long
elong int
são idênticos. Então sãolong long
elong long int
. Nos dois casos, oint
é opcional.Quanto à diferença entre os dois conjuntos, o padrão C ++ exige intervalos mínimos para cada um, e que
long long
é pelo menos tão amplo quantolong
.As partes de controle do padrão (C ++ 11, mas isso já existe há muito tempo) são, por um lado
3.9.1 Fundamental types
, a seção 2 (uma seção posterior fornece regras semelhantes para os tipos integrais não assinados):Há também uma tabela 9
7.1.6.2 Simple type specifiers
, que mostra os "mapeamentos" dos especificadores para tipos reais (mostrando queint
é opcional), cuja seção é mostrada abaixo:Observe a distinção existente entre o especificador e o tipo. O especificador é como você diz ao compilador qual é o tipo, mas você pode usar diferentes especificadores para terminar no mesmo tipo.
Portanto,
long
por si só, não é um tipo nem um modificador, como sugere sua pergunta, é simplesmente um especificador para olong int
tipo. O mesmo vale porlong long
ser um especificador para olong long int
tipo.Embora o próprio padrão C ++ não especifique os intervalos mínimos de tipos integrais, ele cita C99, in
1.2 Normative references
, como aplicável. Portanto, os intervalos mínimos, conforme estabelecido em,C99 5.2.4.2.1 Sizes of integer types <limits.h>
são aplicáveis.Em termos de
long double
, na verdade, é um valor de ponto flutuante em vez de um número inteiro. Da mesma forma que os tipos integrais, é necessário ter pelo menos tanta precisão quantodouble
ae fornecer um superconjunto de valores sobre esse tipo (significando pelo menos esses valores, não necessariamente mais valores).fonte
unsigned
eunsigned int
long
tem pelo menos 32 bits (2 ^ 31-1 em ambos os lados do zero) elong long
é pelo menos 64 (2 ^ 63-1 em ambos os lados).long double
é garantido que tenha pelo menos o intervalo dedouble
, mas pode ser o mesmo. Depende do computador. Algumas FPUs têm precisão estendida; os chips x87 tinham precisão única de 32 bits, precisão dupla de 64 bits e precisão estendida de 80 bits.Long e long int são pelo menos 32 bits.
long long e long long int são pelo menos 64 bits. Você deve estar usando um compilador c99 ou melhor.
duplas longas são um pouco estranhas. Pesquise-os na Wikipedia para obter detalhes.
fonte
long
é equivalente along int
, assim comoshort
é equivalente ashort int
. Along int
é um tipo integral assinado com pelo menos 32 bits, enquanto along long
oulong long int
é um tipo integral assinado com pelo menos 64 bits.Isso não significa necessariamente que a
long long
é mais amplo que along
. Muitas plataformas / ABIs usam oLP64
modelo - ondelong
(e ponteiros) têm 64 bits de largura. O Win64 usa oLLP64
, ondelong
ainda há 32 bits, elong long
(e ponteiros) têm 64 bits de largura.Há um bom resumo dos modelos de dados de 64 bits aqui .
long double
não garante muito mais do que será pelo menos tão largo quanto umdouble
.fonte
Isso parece confuso porque você está usando
long
como um tipo de dados.long
nada mais é do que uma abreviação paralong int
quando você está usando sozinho.long
é um modificador, você pode usá-lodouble
também comolong double
.long
==long int
.Ambos têm 4 bytes.
fonte
Historicamente, nos primeiros tempos C, quando os processadores tinham comprimento de palavra de 8 ou 16 bits,
int
era idêntico ao de hojeshort
(16 bits). Em certo sentido, int é um tipo de dados mais abstrato do quechar
,short
,long
oulong long
, como você não pode ter certeza sobre a largura de bits.Ao definir,
int n;
você pode traduzir isso com "me dê o melhor compromisso de largura de banda e velocidade nesta máquina para n". Talvez no futuro você deva esperar que os compiladores sejam traduzidosint
em 64 bits. Portanto, quando você quiser que sua variável tenha 32 bits e não mais, use melhor um método explícitolong
como tipo de dados.[Editar:
#include <stdint.h>
parece ser a maneira correta de garantir largura de bits usando os tipos int ## _ t, embora ainda não faça parte do padrão.]fonte
long
é garantido como sendo pelo menos 32 bits. (Os padrões podem ser difíceis.) O rascunho atual do C ++ 14 diz apenas: @CM "Ints simples têm o tamanho natural sugerido pela arquitetura do ambiente de execução; os outros tipos de números inteiros assinados são fornecidos para atender a necessidades especiais" (seção 3.9.1 ) Não encontrei nenhuma palavra sobre as relações de comprimento de várias entradas nele. __int32 não é realmente parte do padrão, mas desde o C ++ 11 existem typedefs disponíveis como int_fast32_t ou int_least32_t disponíveis para obter exatamente o que você deseja.char
eram quase unanimemente 8 bits,short
16 elong
32;int
pode ser 16 ou 32. Nota para algumas plataformas (especialmente a 68000), tanto de 16 como de 32 bitsint
eram bastante comuns e, de fato, alguns compiladores tinham opções para oferecer suporte. O código que precisava ser portátil deveria, portanto, usarshort
oulong
preferirint
.Enquanto em Java a
long
é sempre de 64 bits, em C ++ isso depende da arquitetura e do sistema operacional do computador . Por exemplo, umlong
é 64 bits no Linux e 32 bits no Windows (isso foi feito para manter a compatibilidade com versões anteriores, permitindo que programas de 32 bits sejam compilados no Windows de 64 bits sem nenhuma alteração).É considerado um bom estilo C ++ para evitar
short int long ...
e usar:Estes (
int*_t
) podem ser usados depois de incluir o<cstdint>
cabeçalho.size_t
está em<stdlib.h>
.fonte