Corrija-me se eu estiver errada,
int é de 4 bytes, com um intervalo de valores de -2.147.483.648 a 2.147.483.647 (2 ^ 31) de
comprimento é de 4 bytes, com um intervalo de valores de -2.147.483.648 a 2.147.483.647 (2 ^ 31)
Qual é a diferença em C ++? Eles podem ser usados de forma intercambiável?
#include <stdint.h>
e, em seguida, os tipos que informam o tamanho. Por exemplouint32_t
. Em uma nova plataforma, você só precisa garantir que o stdint.h acerte nessa plataforma específica e seu código funcione conforme o esperado.Respostas:
É dependente da implementação.
Por exemplo, no Windows, eles são os mesmos, mas, por exemplo, nos sistemas Alpha, um comprimento era de 64 bits, enquanto um int era de 32 bits. Este artigo aborda as regras para o compilador Intel C ++ em plataformas variáveis. Para resumir:
fonte
A única garantia que você tem é:
Veja também: É
long
garantido que tenha pelo menos 32 bits?fonte
Ao compilar para x64, a diferença entre int e long está entre 0 e 4 bytes, dependendo do compilador usado.
O GCC usa o modelo LP64, o que significa que as entradas são de 32 bits, mas os compridos são de 64 bits no modo de 64 bits.
A MSVC, por exemplo, usa o modelo LLP64, o que significa que ints e longs são 32 bits, mesmo no modo de 64 bits.
fonte
A própria especificação C ++ (versão antiga, mas boa o suficiente para isso) deixa em aberto.
fonte
Como Kevin Haines salienta, as entradas têm o tamanho natural sugerido pelo ambiente de execução, que deve se encaixar em INT_MIN e INT_MAX.
O padrão C89 afirma que
UINT_MAX
deve ser pelo menos 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 eULONG_MAX
2 ^ 32-1. Isso faz uma contagem de bits de pelo menos 16 para short e int e 32 por muito tempo. Para char, afirma explicitamente que deve ter pelo menos 8 bits (CHAR_BIT
). O C ++ herda essas regras para o arquivo limits.h, portanto, no C ++, temos os mesmos requisitos fundamentais para esses valores. No entanto, você não deve derivar que int seja de pelo menos 2 bytes. Teoricamente, char, int e long podem ter 1 byte, e nesse casoCHAR_BIT
deve ter pelo menos 32. Lembre-se de que "byte" é sempre do tamanho de um char; portanto, se char for maior, um byte não terá apenas 8 bits Mais.fonte
byte
exista um tipo de dados em C ++. Não, não é? Se isso acontecer, e umbyte
pode ter outros tamanhos além de 8 bits, é puramente estúpido. Por que eles chamariam de byte, a menos que seja absolutamente necessariamente de 8 bits?Depende do seu compilador. Você tem a garantia de que um longo será pelo menos tão grande quanto um int, mas você não tem a garantia de que será mais.
fonte
Na maioria das vezes, o número de bytes e o intervalo de valores são determinados pela arquitetura da CPU e não pelo C ++. No entanto, o C ++ define requisitos mínimos, o que litb explicou corretamente e Martin York cometeu apenas alguns erros.
A razão pela qual você não pode usar int e long intercambiavelmente é porque eles nem sempre têm o mesmo comprimento. C foi inventado em um PDP-11, onde um byte tinha 8 bits, int tinha dois bytes e poderia ser tratado diretamente por instruções de hardware. Como os programadores C geralmente precisavam de aritmética de quatro bytes, o tempo foi inventado e eram quatro bytes, manipulados pelas funções da biblioteca. Outras máquinas tinham especificações diferentes. O padrão C impôs alguns requisitos mínimos.
fonte
Confiar na implementação de tamanhos de tipos primitivos do fornecedor do compilador voltará a assombrá-lo se você compilar seu código em outra arquitetura de máquina, SO ou compilador de outro fornecedor.
A maioria dos fornecedores de compiladores fornece um arquivo de cabeçalho que define tipos primitivos com tamanhos explícitos. Esses tipos primitivos devem ser usados sempre que o código for potencialmente portado para outro compilador (leia-o como SEMPRE em TODAS as instâncias). Por exemplo, a maioria dos compiladores UNIX possui
int8_t uint8_t int16_t int32_t uint32_t
. Microsoft temINT8 UINT8 INT16 UINT16 INT32 UINT32
. Eu prefiro o Borland / CodeGearint8 uint8 int16 uint16 int32 uint32
. Esses nomes também fornecem um pequeno lembrete do tamanho / intervalo do valor pretendido.Por anos, usei os nomes explícitos de tipos primitivos da Borland e
#include
o seguinte arquivo de cabeçalho C / C ++ (primitive.h), que tem como objetivo definir os tipos primitivos explícitos com esses nomes para qualquer compilador C / C ++ (esse arquivo de cabeçalho pode, na verdade, não cobrir todos os compilador, mas abrange vários compiladores que usei no Windows, UNIX e Linux, mas ainda não define tipos de 64 bits).fonte
O padrão C ++ diz assim:
3.9.1, §2:
A conclusão: depende de qual arquitetura você está trabalhando. Qualquer outra suposição é falsa.
fonte