Obra: Programar em C/Tipos de dados
até agora você só viu as variáveis do tipo int que servem para guardar números inteiros linguagem tem outros tipos fundamentais são eles int para números inteiros entre utiliza bytes char para caracteres individuais do padrão ascii utiliza byte float para reais entre aproximadamente utiliza bytes precisão de dígitos double para reais entre aproximadamente utiliza bytes precisão de dígitos bool para indicar true verdadeiro ou false falso utiliza bytes presente apenas no padrão em diante explicando bits bytes podemos pensar na memória do computador como uma fita uma grande fita feita de frames sequenciais em cada um desses frames podemos colocar uma certa tensão tem tensão ou não tem tensão se tem tensão associamos valor se não tem tensão associamos valor daí termos linguagem binária de zeros uns agora podemos fazer combinações se tivermos posição de zeros uns da direita para esquerda combinação combinação combinação combinação combinação combinação combinação combinação na verdade podemos estender este conceito para um número infinito de combinações ora que aconteceu que nos bastavam pouco menos de combinações bits ordenados para termos uma combinação para cada letra maiúscula minúscula número pontos de exclamação interrogação etc isso era suficiente para nossa comunicação mas para haver um certo consenso para que uma dada combinação desse um dado símbolo surgiu tabela ascii surgiram outras tabelas quando se quis colocar os símbolos de outras línguas como japonês ou chinês ver tabela iso portanto com bits ou casas conseguíamos ter qualquer símbolo que utilizamos esse conjunto de bits chamamos de byte mais portanto um byte tem casas de zeros uns ou seja elevado dá as combinações byte unidade básica que consegue operar representado pelo tipo char pergunta quando tivermos mais do que bytes acrescenta se um outro byte sim com dois bytes número de combinações pergunta qual razão do computador usar apenas bytes como medida mínima será que não seria possível utilizar bits ou bits razão para isso que infraestrutura física hardware dos computadores atuais apenas aceita bytes nativamente porem seria possível projetar um novo tipo de computador que calculasse mais eficientemente utilizando se números diferentes de bits números inteiros se dissermos que bytes representam inteiros poderemos utilizar as combinações pois bytes bits temos elevado isso dar nos ia esses números todos assim se quisermos apenas os positivos com zero temos de se quisermos ter números negativos positivos podemos dividir esse valor meio dá para cada lado positivo negativo mas como temos de ter zero vamos roubar um valor ao lado positivo então ficamos com intervalo ficamos com as mesmas combinações apresentamos inteiro com bytes mas eles podem ter bytes isso vai depender do processador do computador com quantos bytes consegue ele lidar ao mesmo tempo também existem outros tipos como short ou short int que serve para inteiros menores long ou long int para inteiros maiores qualquer tipo in
ou short int que serve para inteiros menores long ou long int para inteiros maiores qualquer tipo inteiro pode ser precedido por unsigned signed para com negativos para cortar os números negativos permitindo maior capacidade de armazenamento de números positivos alguns compiladores aceitam long long para aumentar ainda mais tamanho da variável alguns desses só aceitam para tipo int outros também para tipo double podemos alterar maneira como os dados são guardados com os modificadores de tipo você pode modificar os tipos de duas maneiras tamanho short long você pode modificar tamanho de uma variável usando os modificadores de tipo que são dois short long note que float char não podem ser modificados em tamanho short diminui espaço necessário para guardar variável diminuindo também gama de valores que esta pode assumir só pode ser usado com int long aumenta espaço tomado pela variável portanto aumenta seu valor máximo ou sua precisão pode ser usado com int double padrão de adicionou um terceiro modificador suportado pelos compiladores mais recentes inclusive gcc long long que aumentaria ainda mais capacidade da variável alguns deles suportam esse modificador apenas para tipo int outros suportam também para double uma observação necessária segundo padrão não existe nenhuma garantia de que uma variável short int menor que uma variável int nem que long int maior que int apenas garantido que int não maior que long nem menor que short de fato nos sistemas de bits ou seja maioria dos computadores pessoais atualmente tamanho de int igual ao de long geralmente int será tamanho nativo do processador ou seja bits num processador de bits bits num processador de bits etc sinal signed unsigned existe outro tipo de modificador que define se número vai ser guardado com sinal ou não são os modificadores signed unsigned suportados pelos tipos inteiros apenas signed diz que número deve ser guardado com sinal ou seja serão permitidos valores positivos negativos esse padrão portanto esse modificador não muito usado unsigned diz que número deve ser guardado sem sinal com isso valor máximo da variável aumenta já que não teremos mais valores negativos por exemplo com uma variável char podemos guardar valores de mas com uma variável unsigned char pode guardar valores de para usar esses modificadores devemos colocá los antes do nome do tipo da variável sendo que modificador de sinal deve vir antes do modificador de tamanho caso ambos sejam usados por exemplo unsigned char short int valor unsigned long int resultado nota você pode abreviar short int long int para simplesmente short long respectivamente tabela de tipos inteiros convém ver tabela de tipos inteiros tipo num de bits formato para intervalo leitura com scanf inicio fim char unsigned char signed char int unsigned int signed int short int hi unsigned short int hu signed short int hi long int li signed long int li unsigned long int lu nota tipo long bits como int em computadores de arquitetura bits bits em computado
igned long int lu nota tipo long bits como int em computadores de arquitetura bits bits em computadores de arquitetura bits no padrão lp mac os unix números de ponto flutuante os números de ponto flutuante são uma tentativa para guardar números reais como pi ao contrário dos números reais os números representáveis pelo hardware são finitos maneira como os tipos de ponto flutuante são armazenados abstrata para programador entretanto hardware segue padrão ieee standard for floating point arithmetic armazenamento feito usando notação científica binária decimal notation scientific notation notation os tipos float double servem para guardar números de ponto flutuante diferença entre os dois além do intervalo de dados precisão geralmente tipo float guarda dados com sinal positivo ou negativo de além do zero já double suporta números tão pequenos quanto no máximo float double lf long double lf nota tipo long double trabalha em máquinas no padrão lp mac os unix bool este tipo surgiu porque muitas vezes apenas se quer ter valores sim não verdadeiro falso tem tamanho de um byte tem apenas dois valores que corresponde true false por que guardar um bool num byte quando se pode utilizar apenas um bit razão que computador usa no mínimo byte não bit endereços os vários locais na memória são identificados por um address que tem uma lógica sequencial numerada são necessários bits para guardar endereço de um byte dito de outra forma são necessários bytes para guardar morada de um byte será isto verdade isso quer dizer que se guardarmos os endereços de todos os bytes só temos da memória disponível para guardar valores bem isto um pouco estranho mas repare se que apenas vamos guardar os addresses das variáveis reservadas depois as variáveis nem sempre são de byte por isso apenas iremos guardar endereço do primeiro byte não de todos por fim faz sentido guardar endereço de outro endereço os endereços de memória addresses são normalmente expressos em linguagem hexadecimal base utilizam os algarismos mais as primeiras letras de até do alfabeto para fazerem as compatibilidade de dados na atribuição de valor se tentarmos colocar um valor diferente do tipo esperado da variável temos um problema de compatibilidade de dados caso declaramos um int colocamos uma letra aqui não teremos problemas os literais de caracteres são nativamente do tipo int resultado será um inteiro que contém valor ascii do caractere dado caso declaramos um int colocamos uma string sequência de caracteres aqui teremos um erro de compilação em que nos diz que não conseguimos converter const char em int perceba com isso que compilador tem alguns sistemas de conversão note caso caso declaramos um int colocamos um float neste caso se colocarmos irá ser apenas guardado valor perdendo se parte decimal caso overflow declaramos um short colocamos um valor maior que máximo lembre se que tipo short guarda valores de se colocarmos compilador não estender esses limites não vai acontecer nenhum erro de compilação q
de se colocarmos compilador não estender esses limites não vai acontecer nenhum erro de compilação que resulta que vai ser impresso um número negativo ou como comum em vários compiladores lógica disto tem ver com maneira como computador guarda números negativos mas também podemos fazer uma analogia com as horas imaginemos que vamos somar horas com horas resultado seria mas como não existe no relógio iríamos dar volta nas horas chegar ao assim resultado será caso underflow declaramos um short colocamos um valor inferior ao mínimo possível aqui temos exatamente mesma lógica do caso de overflow mas desta vez excedido limite inferior não superior caso declaramos um unsigned int colocamos um número negativo que acontece aqui semelhante um underflow mas que ocorre que número guardado como seria se fosse um int comum negativo que muda na prática interpretação desse número de acordo com tipo de dado que lhe está atribuído se tentarmos lê lo como um unsigned int obteremos um valor positivo obtido pela mesma lógica do overflow underflow se lermos como um signed int obteremos mesmo valor negativo que lhe atribuímos converter um tipo de variável conversão de uma variável consiste em converter tipo de uma variável em um outro imagine que você esteja trabalhando com uma variável do tipo float por alguma razão queira eliminar os números que estão depois da vírgula esta operação pode ser realizada de duas maneiras conversões do tipo implícita consiste em uma modificação do tipo de variável que feita automaticamente pelo compilador ex int conversões do tipo explícita também chamada de operação cast consiste em forçar modificação do tipo de variável usando operador cast ex int int veja um exemplo da conversão de tipo inteiro em caracteres aqui convertemos um número decimal em um caractere ascii include int main int char char printf numero inteiro caractere return literais em programação um literal uma notação que representa um valor constante exemplos de literais em são joão esses exemplos representam os quatro tipos de literais em literais de inteiros literais de reais literais de caracteres literais de strings só com esses exemplos já possível deduzir como se usam os literais mas importante fazer algumas observações literais de inteiros podem ser especificados nas bases decimal octal ou hexadecimal se literal for prefixado com ou ele será interpretado como hexadecimal se prefixo for apenas será interpretado como octal ou se não houver prefixo será interpretado como decimal literais de reais podem ser especificados na forma decimal ou em notação científica lembre se que separador decimal ponto não vírgula como seria usual literais de caracteres devem vir entre aspas simples conter representação de apenas um caractere usos válidos seriam se você quiser usar aspa simples como caractere preceda com uma barra invertida literais de strings devem vir entre aspas duplas para usar aspas duplas dentro de strings preceda as com barra invertida ele disse olá note que um lit
ara usar aspas duplas dentro de strings preceda as com barra invertida ele disse olá note que um literal de string adiciona caractere nulo ao final da string pois ele em maneira de delimitar final de uma string na verdade segundo padrão literais de caracteres podem conter representação de mais um caractere mas uso deles seria para representar números não sequências de caracteres um aspecto pouco utilizado da linguagem