Tipo de dados mais longo em c. Tipos char, curto, int e longo

Tipos de dados

Os tipos de dados são especialmente importantes em C# porque é uma linguagem fortemente tipada. Isso significa que todas as operações estão sujeitas a uma verificação rigorosa de tipo pelo compilador e as operações ilegais não são compiladas. Conseqüentemente, a verificação rigorosa de tipos elimina erros e aumenta a confiabilidade dos programas. Para impor a verificação de tipo, todas as variáveis, expressões e valores devem ser de um tipo específico. Não existe variável “sem tipo” nesta linguagem de programação. Além disso, o tipo de valor determina as operações que podem ser realizadas nele. Uma operação legal para um tipo de dados pode não ser válida para outro.

Existem duas categorias gerais de tipos de dados integrados em C#: tipos de valor E tipos de referência. Eles diferem no conteúdo da variável. Conceitualmente, a diferença entre os dois é que um tipo de valor armazena dados diretamente, enquanto um tipo de referência armazena uma referência a um valor.

Esses tipos são armazenados em diferentes locais na memória: os tipos de valor são armazenados em uma área conhecida como pilha e os tipos de referência são armazenados em uma área conhecida como heap gerenciado.

Vamos dar uma olhada tipos de valor.

Tipos inteiros

C# define nove tipos inteiros: char, byte, sbyte, curto, ushort, int, uint, longo e ulong. Mas o tipo char é usado principalmente para representar caracteres e, portanto, é tratado separadamente. Os oito tipos inteiros restantes são para cálculos numéricos. Abaixo estão a faixa de números e profundidade de bits:

Tipos inteiros C#
Tipo Digite CTS Tamanho dos bits Faixa
byte Sistema.Byte 8 0:255
byte Sistema.SByte 8 -128:127
curto Sistema.Int16 16 -32768: 32767
ucurto Sistema.UInt16 16 0: 65535
interno Sistema.Int32 32 -2147483648: 2147483647
unint Sistema.UInt32 32 0: 4294967295
longo Sistema.Int64 64 -9223372036854775808: 9223372036854775807
longe Sistema.UInt64 64 0: 18446744073709551615

Como mostra a tabela acima, C# define variantes com e sem sinal dos vários tipos inteiros. Os tipos inteiros assinados diferem de seus equivalentes não assinados na forma como interpretam o bit mais significativo do inteiro. Assim, se um programa especificar um valor inteiro assinado, o compilador C# gerará código que usa o bit mais significativo do inteiro como sinalizador de sinal. Um número é considerado positivo se o sinalizador for 0 e negativo se for 1.

Os números negativos são quase sempre representados pelo método do complemento de dois, em que todos os dígitos binários do número negativo são primeiro invertidos e depois 1 é adicionado a esse número.

Provavelmente o tipo inteiro mais comum em programação é tipo interno. Variáveis ​​do tipo int são frequentemente usadas para controle de loop, indexação de array e cálculos matemáticos de uso geral. Quando você precisa de um valor inteiro com um intervalo de representações maior que o tipo int, há vários outros tipos de inteiros disponíveis para essa finalidade.

Portanto, se o valor precisar ser armazenado sem sinal, você poderá selecionar para isso tipo uint, para grandes valores assinados - tipo longo, e para grandes valores não assinados - digite longe. Como exemplo, segue abaixo um programa que calcula a distância da Terra ao Sol em centímetros. Para armazenar um valor tão grande, ele usa uma variável longa:

Usando Sistema; usando System.Collections.Generic; usando System.Linq; usando System.Text; namespace ConsoleApplication1 (class Program ( static void Main(string args) ( long result; const long km = 149800000; // distância em km. result = km * 1000 * 100; Console.WriteLine(result); Console.ReadLine(); ) ) )

Todas as variáveis ​​​​inteiras podem receber valores em notações decimais ou hexadecimais. Neste último caso, é necessário um prefixo 0x:

Longo x = 0x12ab;

Se houver alguma incerteza se um valor inteiro é do tipo int, uint, long ou ulong, então padrão int é aceito. Para especificar explicitamente que outro tipo inteiro um valor deve ter, os seguintes caracteres podem ser anexados a um número:

Uint ui = 1234U; longo eu = 1234L; ulongul = 1234UL;

U e L também podem ser escritos em letras minúsculas, embora um L minúsculo possa ser facilmente confundido visualmente com o número 1 (um).

Tipos de ponto flutuante

Os tipos de ponto flutuante permitem representar números com uma parte fracionária. Existem dois tipos de dados de ponto flutuante em C#: flutuador E dobro. Eles representam valores numéricos em precisão simples e dupla, respectivamente. Assim, a largura do tipo float é de 32 bits, o que corresponde aproximadamente à faixa de representação dos números de 5E-45 a 3,4E+38. E a largura do tipo double é de 64 bits, o que corresponde aproximadamente à faixa de representação de números de 5E-324 a 1,7E+308.

O tipo de dados float destina-se a valores menores de ponto flutuante que requerem menos precisão. O tipo de dados double é maior que float e oferece um maior grau de precisão (15 bits).

Se um valor não inteiro estiver codificado no código-fonte (por exemplo, 12.3), o compilador geralmente assume que se pretende um valor duplo. Se o valor precisar ser especificado como float, você precisará anexar o caractere F (ou f):

Flutuador f = 12,3F;

Tipo de dados decimais

Um tipo decimal também é fornecido para representar números de ponto flutuante de alta precisão. decimal, que se destina ao uso em cálculos financeiros. Este tipo possui largura de 128 bits para representar valores numéricos que variam de 1E-28 a 7,9E+28. Você provavelmente sabe que a aritmética regular de ponto flutuante está sujeita a erros de arredondamento decimal. Esses erros são eliminados usando o tipo decimal, que permite que os números sejam representados com 28 (e às vezes 29) casas decimais. Como esse tipo de dados pode representar valores decimais sem erros de arredondamento, é especialmente útil para cálculos financeiros:

Usando Sistema; usando System.Collections.Generic; usando System.Linq; usando System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // *** Cálculo do custo de um investimento com *** // *** taxa de retorno fixa*** decimal money, percent; int i; const byte anos = 15; dinheiro = 1000,0m por cento = 0,045m;

O resultado deste programa será:

Símbolos

Em C#, os caracteres não são representados em código de 8 bits, como em muitas outras linguagens de programação, como C++, mas em código de 16 bits, chamado Unicode. O conjunto de caracteres do Unicode é tão amplo que abrange caracteres de quase todas as línguas naturais do mundo. Embora muitas línguas naturais, incluindo o inglês, o francês e o alemão, tenham alfabetos relativamente pequenos, algumas outras línguas, como o chinês, utilizam conjuntos de caracteres bastante grandes que não podem ser representados por um código de 8 bits. Para superar essa limitação, C# define digite caractere, que representa valores não assinados de 16 bits variando de 0 a 65.535. No entanto, o conjunto de caracteres ASCII padrão de 8 bits é um subconjunto de Unicode que varia de 0 a 127. Portanto, os caracteres ASCII ainda são válidos em C#.

Esta folha de dicas fornece informações sobre os principais tipos de dados da linguagem de programação C++ e os recursos de sua implementação. Além disso, ao final do registro há uma tabela com os intervalos de valores desses tipos.

Conceito de tipo de dados

O principal objetivo de qualquer programa é processar dados. Diferentes tipos de dados são armazenados e processados ​​de maneira diferente. Em qualquer linguagem algorítmica, cada constante, variável, expressão ou função deve ter um tipo específico.

O tipo de dados define:

  • representação interna de dados na memória do computador;
  • o conjunto de valores que quantidades deste tipo podem assumir;
  • operações e funções que podem ser aplicadas às quantidades deste tipo.

Com base nessas características, o programador seleciona o tipo de cada grandeza utilizada no programa para representar objetos reais. Uma declaração de tipo obrigatória permite ao compilador verificar a validade de várias construções do programa. O tipo de valor determina as instruções de máquina que serão utilizadas para processar os dados.

Todos os tipos de linguagem C++ podem ser divididos em básico E composto . A linguagem C++ define seis principal tipos de dados para representar valores inteiros, reais, de caracteres e lógicos. Com base nesses tipos, o programador pode inserir uma descrição composto tipos. Isso inclui matrizes, enumerações, funções, estruturas, referências, ponteiros, uniões e classes.

Tipos de dados básicos em C++

Os tipos de dados básicos (padrão) são frequentemente chamados de aritméticos porque podem ser usados ​​em operações aritméticas. Para descrever os principais tipos, são definidos os seguintes:

  1. int(int);
  2. char(char);
  3. wchar_t(widechar);
  4. bool(booleano);
  5. flutuar(real);
  6. double (precisão dupla real).

Os primeiros quatro tipos são chamados de inteiro ( todo ), os dois últimos - tipos de ponto flutuante . O código que o compilador gera para tratar valores inteiros é diferente do código para valores de ponto flutuante.

Existem quatro especificador de tipo , esclarecendo a representação interna e a faixa de valores dos tipos padrão:

  • curto (curto);
  • longo(longo);
  • assinado(assinado);
  • não assinado.

Tipo inteiro (int)

O tamanho do tipo int não é definido pelo padrão, mas depende do computador e do compilador. Para um processador de 16 bits, 2 bytes são alocados para valores desse tipo, para um processador de 32 bits - 4 bytes.

O especificador curto antes do nome do tipo indica ao compilador que 2 bytes devem ser alocados para o número, independentemente da capacidade de bits do processador. O especificador longo significa que o valor inteiro ocupará 4 bytes. Portanto, em um computador de 16 bits, os equivalentes são int e short int, e em um computador de 32 bits, os equivalentes são int e long int.

Representação interna valores do tipo inteiro - um número inteiro em código binário. Ao usar o especificador assinado, o bit mais significativo do número é interpretado como assinado (0 é um número positivo, 1 é um número negativo). O especificador sem sinal permite que apenas números positivos sejam representados, uma vez que o bit mais significativo é tratado como parte do código do número. Assim, o intervalo de valores do tipo int depende dos especificadores. Os intervalos de valores do tipo inteiro com vários especificadores para computadores compatíveis com IBM PC são fornecidos na tabela “Intervalos de valores de tipos de dados simples” no final da entrada.

Por padrão, todos os tipos inteiros são considerados assinados, o que significa que o especificador assinado pode ser omitido.

As constantes encontradas em um programa são atribuídas a um tipo ou outro de acordo com seu tipo. Se por algum motivo o programador não estiver satisfeito com este tipo, ele poderá indicar explicitamente o tipo necessário usando os sufixos L, l (longo) e U, u (sem sinal). Por exemplo, a constante 32L será do tipo long e ocupará 4 bytes. Você pode usar os sufixos L e U ao mesmo tempo, por exemplo, 0x22UL ou 05Lu.

Observação

Os tipos short int, long int, Signed Int e Unsigned Int podem ser abreviados para Short, Long, Signed e Unsigned, respectivamente.

Tipo de caractere (char)

O valor de um tipo de caractere recebe um número de bytes suficiente para acomodar qualquer caractere do conjunto de caracteres de um determinado computador, que é o que determina o nome do tipo. Normalmente, isso é 1 byte. O tipo char, como outros tipos inteiros, pode ser assinado ou não. Os valores assinados podem armazenar valores no intervalo de -128 a 127. Usando o especificador não assinado, os valores podem variar de 0 a 255. Isso é suficiente para armazenar qualquer caractere no conjunto de caracteres ASCII de 256 caracteres. Valores do tipo char também são usados ​​para armazenar números inteiros que não excedem os limites dos intervalos especificados.

Tipo de caractere estendido (wchar_t)

O tipo wchar_t foi projetado para funcionar com um conjunto de caracteres para os quais 1 byte não é suficiente para codificar, por exemplo, Unicode. O tamanho deste tipo depende da implementação; via de regra, corresponde ao tipo curto. Constantes de string do tipo wchar_t são escritas com o prefixo L, por exemplo, L»Gates».

Tipo booleano (bool)

Os valores booleanos só podem assumir os valores verdadeiro e falso, que são palavras reservadas. A forma interna de representar o valor falso é 0 (zero). Qualquer outro valor é interpretado como verdadeiro. Quando convertido para um tipo inteiro, true tem o valor 1.

Tipos de ponto flutuante (float, double e long double)

O padrão C++ define três tipos de dados para armazenar valores reais: float, double e long double.

Os tipos de dados de ponto flutuante são armazenados na memória do computador de maneira diferente dos tipos de dados inteiros. A representação interna de um número real consiste em duas partes – a mantissa e o expoente. Em computadores compatíveis com IBM PC, os valores flutuantes ocupam 4 bytes, dos quais um dígito binário é alocado para o sinal da mantissa, 8 bits para o expoente e 23 para a mantissa. A mantissa é um número maior que 1,0, mas menor que 2,0. Como o dígito inicial da mantissa é sempre 1, ele não é armazenado.

Para valores duplos que ocupam 8 bytes, são alocados 11 e 52 bits para o expoente e mantissa, respectivamente. O comprimento da mantissa determina a precisão do número e o comprimento do expoente determina seu alcance. Como você pode ver na tabela no final da entrada, com o mesmo número de bytes alocados para valores float e long int, os intervalos de seus valores permitidos diferem bastante devido ao formulário de representação interna.

O especificador longo antes de um nome de tipo duplo indica que 10 bytes são alocados para seu valor.

As constantes de ponto flutuante são do tipo double por padrão. Você pode especificar explicitamente o tipo de uma constante usando os sufixos F, f (float) e L, l (long). Por exemplo, a constante 2E+6L será do tipo long double e a constante 1.82f será do tipo float.

Para escrever programas que sejam portáveis ​​entre plataformas, você não pode fazer suposições sobre o tamanho do tipo int. Para obtê-lo, deve-se utilizar a operação sizeof, cujo resultado é o tamanho do tipo em bytes. Por exemplo, para o sistema operacional MS-DOS sizeof (int) resultará em 2, mas para Windows 98 ou OS/2 o resultado será 4.

O padrão ANSI não especifica intervalos de valores para tipos básicos, apenas são definidas as relações entre seus tamanhos, por exemplo:

sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(curto) ≤ sizeof(int) ≤ sizeof(longo)

Observação

Os valores mínimo e máximo permitidos para tipos inteiros dependem da implementação e são fornecidos no arquivo de cabeçalho (), características de tipos reais - no arquivo (), bem como no modelo de classe numeric_limits

digite vazio

Além dos listados, os principais tipos de linguagem incluem o tipo void, mas o conjunto de valores desse tipo está vazio. É usado para definir funções que não retornam um valor, para especificar uma lista vazia de argumentos de função, como tipo base para ponteiros e em operações de conversão de tipo.

Intervalos de valores de tipos de dados simples em C++ para computadores compatíveis com IBM PC

P: O que significa o termo computador compatível com IBM PC?
R: Um computador compatível com IBM PC é um computador com arquitetura semelhante ao IBM PC, XT e AT. Os computadores compatíveis com IBM PC são construídos em microprocessadores compatíveis com o Intel 8086 (e, como você sabe, todos os processadores Intel posteriores são totalmente compatíveis com versões anteriores do 8086). Na verdade, estes são quase todos computadores modernos.

Vários tipos de tipos inteiros e reais, diferindo no alcance e precisão da representação dos dados, foram introduzidos para dar ao programador a oportunidade de utilizar de forma mais eficaz as capacidades de equipamentos específicos, uma vez que a velocidade dos cálculos e a quantidade de memória dependem de a escolha do tipo. Mas um programa otimizado para um tipo de computador pode não ser portável para outras plataformas; portanto, em geral, você deve evitar depender de características específicas de tipos de dados.

Tipo Faixa de valores Tamanho (bytes)
bool verdadeiro e falso 1
caractere assinado -128 … 127 1
caractere não assinado 0 … 255 1
assinado curto int -32 768 … 32 767 2
int curto não assinado 0 … 65 535 2
assinado longo int -2 147 483 648 … 2 147 483 647 4
não assinado longo int 0 … 4 294 967 295 4
flutuador 3,4e-38…3,4e+38 4
dobro 1,7e-308…1,7C+308 8
longo duplo 3.4e-4932…3.4e+4932 10

Para tipos reais, a tabela mostra os valores absolutos dos valores mínimo e máximo.

PARA dados refere-se a qualquer informação apresentada de forma que permita automatizar a sua recolha, armazenamento e processamento num computador (números, símbolos, bits, etc.).
Os dados do programa podem ser original(definido na entrada do programa) ou processando resultados(intermediário ou fim de semana).
Todos os dados – variáveis ​​e constantes – pertencem a um tipo específico.
Cada tipo de dados tem seu próprio associado faixa de valores(número de bytes para um valor) e operações válidas.

Os tipos de dados em C/C++ são divididos em básico E derivados.
Os principais tipos incluem:

  1. vazio(tipo vazio),
  2. interno(tipo inteiro),
  3. flutuador(números reais de ponto flutuante),
  4. dobro(números reais de ponto flutuante de precisão dupla),
  5. personagem(tipo de personagem),
  6. bool- lógico.

Tipos compostos

Para gerar outros tipos de uso de dados básico tipos + chamados especificadores. Os tipos de dados criados a partir de tipos padrão usando especificadores são chamados tipos de dados compostos. C++ define quatro especificadores de tipo de dados:
  1. curto - curto;
  2. longo - longo;
  3. assinado-assinado;
  4. não assinado
Os tipos derivados são:
  • matrizes,
  • funções,
  • aulas,
  • sinais,
  • links,
  • estruturas,
  • associações.

Tipo de personagem

Tipo de dados personagem sempre ocupam 1 byte na memória do computador. Isso se deve ao fato de que normalmente a quantidade de memória alocada para um valor de tipo de caractere é a necessária para armazenar qualquer um dos 256 caracteres do teclado.
O tipo de caractere pode ser com um sinal ou não assinado.
Em quantidades assinadas caractere assinado você pode armazenar valores no intervalo de -128 a 127. Assim, os valores de variáveis ​​​​como caractere não assinado pode variar de 0 a 255.
Tipo de dados Faixa de valores Tamanho
personagem -128...+127 1 byte
caractere não assinado 0...255 1 byte
caractere assinado -128...127 1 byte

Ao trabalhar com dados de caracteres, você precisa lembrar que se uma expressão contiver caractere único, deve ser colocado dentro aspas simples. Uma sequência de caracteres, ou seja, uma string, quando usada em expressões é entre aspas duplas. Por exemplo: ‘F’, ‘3’, “Ivan”, “235”

Tipo inteiro

Tipo de dados interno na memória do computador pode ocupar 2, 4 ou 8 bytes. Isso depende do tamanho do bit do processador.
Por padrão, todos os tipos inteiros são considerados assinados, ou seja, o especificador assinado(sinal) não pode ser especificado.
Especificador não assinado(sem sinal) permite que apenas números positivos sejam representados.

Intervalos de valores inteiros

Tipo de dados Faixa de valores Tamanho (bytes)
interno
assinado int
assinado longo int
-2147483648 ... 2147483647 4
int não assinado
não assinado longo int
0 ... 4294967295 4
curto int
assinado curto int
-32768 ... 32767 2
int curto não assinado 0... 65535 2
muito longo int \(-(2^{63}-1)...(2^{63}-1)\) 8
não assinado longo
longo interno
\(0...(2^{64}-1)\) 8

Tipo real

A representação interna de um número real na memória do computador é diferente da representação de um número inteiro. Um número de ponto flutuante é representado por em forma exponencial. $$\pm mE\pm p$$ onde eu- mantissa (número inteiro ou fracionário com vírgula decimal), R- ordem (inteiro). Para converter um número na forma exponencial para a notação usual de ponto fixo, você precisa multiplicar a mantissa por dez elevado à potência da ordem. Por exemplo: \(-6,42E+2=-6,42*10^(2)\ )

Intervalos de valores de tipos reais

Tipo de dados Faixa de valores Tamanho (bytes)
flutuador 3,4E-38...3,4E+38 4
dobro 1.7E-308...1.7E+308 8
longo duplo 3.4E-4932...3.4E+4932 10

O comprimento da mantissa determina a precisão do número e o comprimento da ordem do seu intervalo.
Os dados flutuantes ocupam 4 bytes, dos quais 1 bit binário é alocado para o sinal, 8 bits para o expoente e 23 para a mantissa. Como o dígito mais significativo da mantissa é sempre 1, ele não é armazenado.
Os dados do tipo double ocupam 8 bytes, possuem -11 bits para a ordem e -52 bits para a mantissa, respectivamente.
O especificador de tipo longo antes do nome do tipo duplo indica que 10 bytes são alocados para o valor.

Tipo booleano

Variável de tipo bool só pode assumir dois valores verdadeiro(verdadeiro) ou falso(mentira). Qualquer valor diferente de zero é interpretado como verdadeiro e, quando convertido para um tipo inteiro, torna-se 1. O valor falso é representado na memória como 0.

Digite vazio

O conjunto de valores deste tipo está vazio.
O tipo void é usado para:
  • definições de funções que não retornam valor;
  • para especificar uma lista vazia de argumentos de função;
  • como tipo base para ponteiros;
  • na operação de conversão de tipo.

Declarando Variáveis

Variávelé uma área nomeada de memória que armazena um valor de um tipo específico.
A variável tem Nome(identificador) e significado.
Nome serve para acessar a área da memória na qual o valor está armazenado.
Nome(identificador) ​​é uma coleção de letras, números e sublinhados que especifica o nome de uma variável, o nome de uma função ou uma palavra-chave em um programa. A linguagem C/C++ diferencia maiúsculas de minúsculas (ou seja, soma e soma serão tratadas como duas variáveis ​​diferentes).
Onde, tipo– uma palavra-chave que define a quantidade de memória (número de bytes) alocada para armazenar o valor de uma variável (como um objeto de programa), (int – inteiro, float, double – real, char – simbólico, bool – lógico);
Nome– um identificador de variável exclusivo que especifica o endereço simbólico do objeto do programa na memória do computador;
iniciador– o valor inicial da variável, que pode não estar na descrição.
Por exemplo: Variáveis ​​do mesmo tipo podem ser agrupadas separando-as com “,”. As descrições de variáveis ​​de diferentes tipos são separadas por “ ; "
Dependendo de onde são declaradas, as variáveis ​​na linguagem C/C++ podem ser divididas em três classes:
  1. local - declarado dentro de uma função e disponível somente nela;
  2. global - descrito antes de todas as funções e acessível de qualquer lugar do programa;
  3. parâmetros formais de funções são descritos na lista de parâmetros de função.
Exemplo:

Etiquetas: Variáveis ​​C. char, int, unsigned, long, long long, float, double, long double, long float, escopo léxico. Declaração de variáveis. Escopo. Inicialização de variáveis. Nomes de variáveis. Forma exponencial.

Variáveis

Variáveis ​​são usadas para armazenar valores (sic!). Uma variável é caracterizada por um tipo e um nome. Vamos começar com o nome. Em C, uma variável pode começar com um sublinhado ou uma letra, mas não com um número. A variável pode incluir caracteres, números e sublinhados em inglês. A variável não deve corresponder a palavras-chave (estas são palavras especiais usadas como construções de controle, para definir tipos, etc.)

auto dobro interno estrutura
quebrar outro longo trocar
registrar typedef personagem externo
retornar vazio caso flutuador
não assinado padrão para assinado
união fazer se tamanho de
volátil continuar enumeração curto
enquanto em linha
Bem como uma série de outras palavras específicas desta versão do compilador, por exemplo distante, aproximar, pequeno, enorme, asm, asm_ etc.

Por exemplo, os identificadores corretos
a, _, _1_, Sarkasm, a_long_variable, aLongVariable, var19, defaultX, char_type
infiel
1a, $valor, a-valor longo, curto

C é uma linguagem que diferencia maiúsculas de minúsculas. Variáveis ​​denominadas a e A, ou end e END, ou perfectDark e PerfectDarK são variáveis ​​diferentes.

Tipos de variáveis

O tipo de variável determina

  • 1) Tamanho da variável em bytes (quantos bytes de memória o computador irá alocar para armazenar o valor)
  • 2) Representação de uma variável na memória (como serão localizados os bits na área de memória alocada em forma binária).
Existem vários tipos principais em C. Vamos dividi-los em dois grupos - números inteiros e números de ponto flutuante.

Todo

  • personagem- tamanho 1 byte. Sempre! Isso precisa ser lembrado.
  • curto- tamanho 2 bytes
  • interno- tamanho 4 bytes
  • longo- tamanho 4 bytes
  • muito longo- tamanho 8 bytes.
Uma nota deve ser feita aqui. O tamanho das variáveis ​​em C não é definido explicitamente como o tamanho em bytes. A norma apenas afirma que

personagem<= short <= int <= long <= long long

Os valores acima são específicos para o compilador VC2012 em uma máquina de 32 bits. Portanto, se o seu programa depende do tamanho de uma variável, reserve um tempo para descobrir seu tamanho.

Agora vamos determinar o número máximo e mínimo que uma variável de cada tipo pode armazenar. Os números podem ser positivos ou negativos. Os números negativos usam um bit para armazenar o sinal. Às vezes um sinal é necessário (por exemplo, armazenamos uma conta bancária, temperatura, coordenadas, etc.), e às vezes não é necessário (peso, tamanho da matriz, idade da pessoa, etc.). Para fazer isso, C usa o modificador de tipo assinado e não assinado. unsigned char - todos os 8 bits para um número, no total temos um conjunto de números de 00000000 a 11111111 em formato binário, ou seja, de 0 a 255 caracteres assinados de -128 a 128. Em C, as variáveis ​​​​são assinadas por padrão. Portanto, escrever char e char assinado são equivalentes.

Guia. 1 Tamanho dos tipos inteiros em c.
Tipo Tamanho, bytes Valor mínimo Valor máximo
caractere não assinado 1 0 255
caractere assinado
(caractere)
1 -128 127
curto não assinado 2 0 65535
assinado brevemente
(curto)
2 -32768 32767
int não assinado
(não assinado)
4 0 4294967296
assinado int
(int)
4 -2147483648 2147483647
não assinado longo 4 0 4294967296
assinado há muito tempo
(longo)
4 -2147483648 2147483647
não assinado muito tempo 8 0 18446744073709551615
assinado há muito tempo
(muito longo)
8 -9223372036854775808 9223372036854775807

tamanho de

Existe um operador em C que permite obter o tamanho de uma variável em bytes. variável sizeof, ou sizeof(variável) ou sizeof(tipo). Este é um operador porque a função não tem como obter informações de tamanho de tipo durante a execução do aplicativo. Vamos escrever um pequeno programa para verificar os tamanhos das variáveis.

#incluir #incluir int main() ( char c; short s; int i; long l; long long L; //Chama sizeof como uma “função” printf("sizeof(char) = %d\n", sizeof(c)); printf("tamanho(curto) = %d\n", tamanho(s)); printf("tamanho(int) = %d\n", tamanho(i)); \ n", sizeof(l)); printf("sizeof(long long) = %d\n", sizeof(L)); //Chama como operador printf("sizeof(char) = %d\n", tamanhode c); printf("tamanho(curto) = %d\n", tamanhode s); printf(" sizeof(longo longo) = %d\n", sizeof L); _getch(); )

(Acho que está claro que variáveis ​​podem ter qualquer nome válido). Este programa poderia ter sido escrito de forma mais simples

#incluir #incluir int main() ( printf("tamanho(char) = %d\n", sizeof(char)); printf("tamanho(short) = %d\n", sizeof(curto)); printf("tamanhoof( int) = %d\n", sizeof(int)); printf("sizeof(long) = %d\n", sizeof(long)); printf("sizeof(long long) = %d\n", sizeof(long long)); //você não pode chamar sizeof como um operador para um nome de tipo //sizeof int - erro de compilação _getch();

Em C, o mesmo tipo pode ter vários nomes
curto === curto int
longo === longo int
longo longo === longo longo int
int não assinado === não assinado

Tipos de ponto flutuante

  • flutuador- 4 bytes,
  • flutuação longa- 8 bytes
  • dobro- 8 bytes
  • longo duplo- 8 bytes.
Aqui também estão os valores para VC2012, de acordo com o tamanho padrão dos tipos float<= long float <= double <= long double все числа с плавающей точкой - со знаком.

Estouro de variável

C não monitora o estouro de variáveis. Isso significa que aumentando constantemente o valor de, digamos, uma variável do tipo int, eventualmente “redefiniremos o valor”

#incluir #incluir void main() ( unsigned a = 4294967295; int b = 2147483647; //Excesso de tipo não assinado printf("%u\n", a); a += 1; printf("%u", a); //Overflow tipo assinado printf("%d\n", b);

Em geral, o comportamento quando uma variável estoura é definido apenas para o tipo não assinado: um número inteiro sem sinal redefinirá o valor. Para outros tipos, tudo pode acontecer, e se você precisar ficar atento ao overflow, faça isso manualmente verificando os argumentos ou use outros métodos dependendo do compilador e da arquitetura do processador.

Designação de tipo postfix

Ao trabalhar com números, você pode usar letras no final de um número para indicar explicitamente seu tipo, por exemplo

  • 11 - número interno
  • 10u - não assinado
  • 22l ou 22L - longo
  • 3890ll ou 3890LL - longo longo (também lL ou Ll)
  • 80.0f ou 80.f ou 80.0F - float (um ponto decimal deve estar presente na entrada)
  • 3.0 - número duplo
A notação científica também denota um duplo por padrão. #incluir #incluir

int main() ( printf("sizeof(int) = %d\n", sizeof(10)); printf("sizeof(unigned) = %d\n", sizeof(10u)); printf("sizeof( longo) = %d\n", sizeof(10l)); printf("sizeof(long long) = %d\n", sizeof(10ll)); printf("sizeof(float) = %d\n", sizeof(10.f)); printf("sizeof(duplo) = %d\n", sizeof(10.)); );

O código a seguir, entretanto, não produzirá erros porque há uma conversão implícita de tipo

Int a = 10u; duplo g = 3.f;

Formato hexadecimal e octal

#incluir #incluir Ao trabalhar com números, você pode usar formatos hexadecimais e octais. Os números no sistema numérico hexadecimal começam com 0x, no sistema numérico octal começam com zero. Conseqüentemente, se um número começa em zero, ele não deve conter dígitos superiores a 7:

void main() ( int x = 0xFF; int y = 077; printf("hex x = %x\n", x); printf("dec x = %d\n", x); printf("oct x = %o\n", x); printf("oct y = %o\n", y); printf("dec y = %d\n", y); printf("hex y = %x", y);

Notação científica para números A forma exponencial de representação de um número é a representação de um número na forma M e ± p, onde M p- potência de dez. Neste caso, a mantissa deve ter um sinal diferente de zero antes da vírgula.
Por exemplo 1,25 === 1,25e0, 123,5 === 1,235e2, 0,0002341 === 2,341e-4, etc.
As representações 3,2435e7 são equivalentes a 3,2435e+7
Existe outra representação (“engenharia”), em que o grau deve ser múltiplo de três. Por exemplo 1,25 === 1,25e0, 123,5 === 123,5e0, 0,0002341 === 234,1e-6, 0,25873256 === 258,73256e-3, etc.

Declarando Variáveis

Em C, as variáveis ​​são sempre declaradas no início de um bloco (um bloco é uma seção de código delimitada por chaves)

<возвращаемый тип> <имя функции> (<тип> <аргумент>[, <тип> <аргумент>]) (declaração de variáveis, todo o resto)

Ao declarar uma variável, seu tipo e nome são escritos.

Interno; parâmetro duplo;

Você pode declarar múltiplas variáveis ​​do mesmo tipo separando os nomes com uma vírgula

Longo longo arg1, arg2, arg3;

Por exemplo

#incluir #incluir int main() ( int a = 10; int b; while (a>0)( int z = a*a; b += z; ) )

Variáveis ​​são declaradas aqui um E b dentro de uma função principal e variável z dentro do corpo do laço. O código a seguir causará um erro de compilação

Int principal() ( int i; i = 10; int j; )

Isso ocorre porque a declaração da variável vem depois do operador de atribuição. Ao declarar variáveis, você pode inicializá-las imediatamente.
int eu = 0;
No entanto, a inicialização ao declarar uma variável não é considerada uma instrução separada, portanto o código a seguir funcionará

Int principal() ( int i = 10; int j; )

Valor inicial da variável

É muito importante lembrar que variáveis ​​em C não são inicializadas com zero por padrão, como em muitas outras linguagens de programação. Após declarar uma variável, ele armazena “lixo” – um valor aleatório que permanece na área de memória que foi alocada para a variável. Isso se deve, em primeiro lugar, à otimização do programa: se não há necessidade de inicialização, então não há necessidade de desperdiçar recursos escrevendo zeros (nota: variáveis ​​globais são inicializadas com zeros, por que sim, leia este artigo).

#incluir #incluir int main() ( int i; printf("%d", i); getch(); )

Se você executar este programa no VC, um aviso aparecerá durante a execução
Falha na verificação em tempo de execução nº 3 - A variável "i" está sendo usada sem ser inicializada.
Se você clicar em "Continuar", o programa exibirá "lixo". Em muitos outros compiladores não haverá aviso quando o programa for executado.

Escopo variável

As variáveis ​​podem ser locais (declaradas dentro de uma função) ou globais. Uma variável global é visível para todas as funções declaradas neste arquivo. Uma variável local é limitada pelo seu escopo. Quando digo que uma variável é “visível em um local”, significa que naquele local ela está definida e pode ser utilizada. Por exemplo, considere um programa que possui uma variável global

#incluir #incluir interno global = 100; void foo() ( printf("foo: %d\n", global); ) void bar(int global) ( printf("bar: %d\n", global); ) int main() ( foo() ;barra(333);

Será exibido
foo: 100
barra: 333
Aqui está uma variável global global visível para todas as funções. Mas o argumento da função substitui a variável global, portanto, ao passar o argumento 333, o valor local 333 é impresso.
Aqui está outro exemplo

#incluir #incluir interno global = 100; int main() ( int global = 555; printf("%d\n", global); getch(); )

O programa produzirá 555. Assim como no caso anterior, a variável local é “mais importante”. Uma variável declarada em um determinado escopo não é visível fora dele, por exemplo

#incluir #incluir interno global = 100; int main() ( int x = 10; ( int y = 30; printf("%d", x); ) printf("%d", y); )

Este exemplo não será compilado porque a variável sim existe apenas dentro de seu próprio bloco.
Aqui está outro exemplo quando variáveis ​​declaradas dentro de um bloco se sobrepõem

#incluir #incluir interno global = 100; int main() ( int x = 10; ( int x = 20; ( int x = 30; printf("%d\n", x); ) printf("%d\n", x); ) printf( "%d\n",x);

O programa irá imprimir
30
20
10
Variáveis ​​globais devem ser evitadas. Você pode ouvir isso com muita frequência. Vamos tentar descobrir o porquê. Nos seus projetos simples, as variáveis ​​globais parecem bastante normais. Mas imagine que você tem um aplicativo que

  • 1) Desenvolvido por várias pessoas e composto por centenas de milhares de linhas de código
  • 2) Funciona em vários threads

Primeiro, uma variável global, se estiver visível para todos, pode ser alterada por qualquer parte do programa. Você altera uma variável global, deseja escrevê-la e outra parte do programa já a substituiu por outro valor (na verdade, essa é toda uma classe de problemas que surgem em um ambiente multithread). Em segundo lugar, com projetos de grandes dimensões, é impossível acompanhar quem criou as variáveis ​​globais e quando. Os exemplos acima mostram como as variáveis ​​podem se sobrepor, e o mesmo acontecerá em um projeto grande.

Certamente existem situações em que variáveis ​​globais facilitam um programa, mas essas situações não acontecem com frequência ou em suas tarefas de casa, então NÃO CRIE VARIÁVEIS GLOBAIS!
As variáveis ​​​​não podem ser apenas inteiras e de ponto flutuante. Existem muitos outros tipos que exploraremos mais adiante.

Última atualização: 13/11/2017

Como muitas linguagens de programação, C# possui seu próprio sistema de tipos de dados que é usado para criar variáveis. Um tipo de dados define a representação interna dos dados, o conjunto de valores que um objeto pode assumir e as ações válidas que podem ser executadas no objeto.

A linguagem C# possui os seguintes tipos de dados primitivos:

    bool: armazena o valor verdadeiro ou falso (literais booleanos). Representado pelo tipo de sistema System.Boolean

    Bool vivo = verdadeiro; bool estáMorto = falso;

    byte: armazena um número inteiro de 0 a 255 e ocupa 1 byte. Representado pelo tipo de sistema System.Byte

    Byte bit1 = 1; byte bit2 = 102;

    sbyte: armazena um número inteiro de -128 a 127 e ocupa 1 byte. Representado pelo tipo de sistema System.SByte

    Sbyte bit1 = -101; sbyte bit2 = 102;

    short : armazena um número inteiro entre -32768 e 32767 e ocupa 2 bytes. Representado pelo tipo de sistema System.Int16

    Curto n1 = 1; n2 curto = 102;

    ushort: armazena um número inteiro de 0 a 65535 e ocupa 2 bytes. Representado pelo tipo de sistema System.UInt16

    Ucurto n1 = 1; ushort n2 = 102;

    int: armazena um número inteiro de -2147483648 a 2147483647 e ocupa 4 bytes. Representado pelo tipo de sistema System.Int32. Todos os literais inteiros representam valores int por padrão:

    Intuma = 10; interno b = 0b101; // forma binária b =5 int c = 0xFF; // forma hexadecimal c = 255

    uint: armazena um número inteiro de 0 a 4294967295 e ocupa 4 bytes. Representado pelo tipo de sistema System.UInt32

    Uint a = 10; uint b = 0b101; uint c = 0xFF;

    long: armazena um número inteiro de –9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 e ocupa 8 bytes. Representado pelo tipo de sistema System.Int64

    Longo a = -10; longo b = 0b101; c longo = 0xFF;

    ulong: armazena um número inteiro de 0 a 18.446.744.073.709.551.615 e ocupa 8 bytes. Representado pelo tipo de sistema System.UInt64

    Ao longo de a = 10; ulong b = 0b101; ulong c = 0xFF;

    float : armazena um número de ponto flutuante de -3,4*10 38 a 3,4*10 38 e ocupa 4 bytes. Representado pelo tipo de sistema System.Single

    double : armazena um número de ponto flutuante de ±5,0*10 -324 a ±1,7*10 308 e ocupa 8 bytes. Representado pelo tipo de sistema System.Double

    decimal: armazena um número de fração decimal. Se utilizado sem ponto decimal, tem valor de ±1,0*10 -28 a ±7,9228*10 28, pode armazenar 28 casas decimais e ocupa 16 bytes. Representado pelo tipo de sistema System.Decimal

    char: armazena um único caractere em Unicode e ocupa 2 bytes. Representado pelo tipo de sistema System.Char. Literais de caracteres correspondem a este tipo:

    Caractere a = "A"; caractere b = "\x5A"; caractere c = "\u0420";

    string: armazena um conjunto de caracteres Unicode. Representado pelo tipo de sistema System.String. Literais de caracteres correspondem a esse tipo.

    String olá = "Olá"; string palavra = "mundo";

    objeto: pode armazenar um valor de qualquer tipo de dados e ocupa 4 bytes em uma plataforma de 32 bits e 8 bytes em uma plataforma de 64 bits. Representado pelo tipo de sistema System.Object, que é o tipo base para todos os outros tipos e classes .NET.

    Objeto a = 22; objeto b = 3,14; objeto c = "olá código";

Por exemplo, vamos definir diversas variáveis ​​de diferentes tipos e exibir seus valores no console:

Usando Sistema; namespace HelloApp (class Program (static void Main(string args) (string name = "Tom"; int age = 33; bool isEmployed = false; double peso = 78,65; Console.WriteLine($"Nome: (nome)"); Console.WriteLine($"Idade: (idade)"); Console.WriteLine($"Peso: (peso)"); Console.WriteLine($"Trabalhando: (estáEmployed)" ) )

Para enviar dados para o console, a interpolação é usada aqui: um sinal $ é colocado na frente da linha e depois disso podemos inserir valores de variáveis ​​​​na linha entre colchetes. Saída do console do programa:

Nome: Tom Idade: 33 Peso: 78,65 Obras: Falso

Usando sufixos

Ao atribuir valores, você precisa ter em mente a seguinte sutileza: todos os literais reais são tratados como valores do tipo double . E para indicar que um número fracionário representa um tipo float ou um tipo decimal, você precisa adicionar um sufixo ao literal: F/f para float e M/m para decimal.

Da mesma forma, todos os literais inteiros são tratados como valores int. Para indicar explicitamente que um literal inteiro representa um valor do tipo uint, use o sufixo U/u, para o tipo long use o sufixo L/l e para o tipo ulong use o sufixo UL/ul:

Uint a = 10U; longo b = 20L; ulong c = 30UL;

Usando tipos de sistema

Acima, ao listar todos os tipos de dados básicos, o tipo de sistema foi mencionado para cada um. Porque o nome de um tipo integrado é essencialmente uma abreviação de um tipo de sistema. Por exemplo, as seguintes variáveis ​​serão equivalentes em tipo:

Intuma = 4; System.Int32 b = 4;

Digitação implícita

Anteriormente, especificamos explicitamente o tipo de variáveis, por exemplo, int x; . E o compilador, quando lançado, já sabia que x armazena um valor inteiro.

No entanto, também podemos usar o modelo de digitação implícito:

Var hello = "Inferno para o mundo"; varc = 20; Console.WriteLine(c.GetType().ToString()); Console.WriteLine(hello.GetType().ToString());

Para digitação implícita, a palavra-chave var é usada em vez do nome do tipo de dados. Então, durante a compilação, o próprio compilador infere o tipo de dados com base no valor atribuído. O exemplo acima usou a expressão Console.WriteLine(c.GetType().ToString()); , o que nos permite descobrir o tipo inferido da variável c. Como por padrão todos os valores inteiros são tratados como valores int, a variável c acabará sendo do tipo int ou System.Int32

Essas variáveis ​​são semelhantes às normais, mas apresentam algumas limitações.

Primeiro, não podemos primeiro declarar uma variável digitada implicitamente e depois inicializá-la:

// este código funciona int a; uma = 20; // este código não funciona var c; c = 20;

Segundo, não podemos especificar null como o valor de uma variável digitada implicitamente:

// este código não funciona var c=null;

Como o valor é nulo, o compilador não poderá inferir o tipo de dados.

duplo ou decimal

Da lista de tipos de dados acima, é óbvio que se quisermos usar números até 256 em um programa, podemos usar variáveis ​​de tipo byte para armazená-los. Ao usar valores grandes, podemos usar o tipo short, int, long. O mesmo vale para números fracionários - para números fracionários comuns você pode usar o tipo float, para números fracionários muito grandes - o tipo double. O tipo decimal se destaca aqui no sentido de que, apesar de sua maior capacidade de bits em comparação com o tipo double, o tipo double pode armazenar um valor maior. No entanto, um valor decimal pode conter até 28 casas decimais, enquanto um valor duplo pode conter de 15 a 16 casas decimais.

Decimal é usado com mais frequência em cálculos financeiros, enquanto duplo é usado com mais frequência em operações matemáticas. As diferenças gerais entre esses dois tipos podem ser resumidas na tabela a seguir.