Programar em C/Tipos de dados: diferenças entre revisões
[edição verificada] | [edição não verificada] |
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição |
|||
Linha 1:
{{reciclagem}}
== Tipos de memória
Existem 3 tipos principais de locais de memória no computador:
*'''The central processing unit (CPU) – cache memory'''
**A CPU para além da coordenação das operações do computador tem um tipo de memória que se chama Cache memory. É nesta memória existe um segmento a que se dá o nome de register, que é usada frequentemente para guardar as instruções e dados mais frequentes.
**A CPU pode aceder a esta memória muito rapidamente
**No entanto não se consegue guardar muita memória, ie, muitos dados, ela é pequena daí se usar o RAM
**A memória é temporária (as instruções e dados são perdidos na ausência de energia)
*'''Random access memory (RAM)'''
**O cpu consegue aceder aos dados do ram quase tão rapidamente como ao cache.
**A memória ram é maior do que a cache, ie, consegue-se guardar mais dados.
**No entanto a memória é temporária (as instruções e dados são perdidos na ausência de energia)
*'''Persistent storage'''
**Chama-se a esta memória persistente porque ela permanece mesmo após ausência de energia, ie, se desligarmos da corrente e a voltarmos a ligar conseguimos aceder novamente aos dados.
**Exemplos são o hard drive, floppy disk, zip disk, optical drive...
**Têm mais capacidade do que o ram e o cache, ie, conseguem guardar mais informação
**No entanto um programa de computador não consegue executar instruções localizadas na persistent storage. os dados e instruções têm de ser loaded para o ram.
por isso geralmente se fala, ie, se focaliza a conversa da memoria sobre o RAM, e não tanto nos outros tipos de memória
*Ainda temos os conceitos de:
**
**
**
Para não entrar em extremos detalhes, antes do tempo, vamos assumir que estamos sempre a trabalhar em RAM, até algo em contrário. Além de que até é bastante verdade, pois todos os dados passam por ela.
16-bit CPU pode processar 16 bits ou 2 bytes ao mesmo tempo. Um 64-bit CPU pode processar 8 bytes ao mesmo tempo.
== Explicando Bits e Bytes ==
Linha 60 ⟶ 54:
Temos o char que é um caracteres da tabela ASCII, que ocupa um byte, logo temos 256 combinações. Este nº de combinações dá para termos todo o alfabeto, minúsculas e maiúsculas, os algarismos de 0 a 9 e todas as marcas de pontuação tipo :.;!?, etc
== Números inteiros ==
Mas agora observem o ponto: com a tipologia char apenas podemos expressar dois dígitos com dois bytes certo. (cada byte-um digito(numero))
Mas se dissermos que aqueles 2 bytes são ints. já poderemos utilizar as 65 536 combinações pois 2 bytes -16bits- temos
Assim se quisermos apenas os positivos com o zero temos de [0, 65535]
Linha 94 ⟶ 86:
|}
'''Pergunta''': porque é que existe o long, se o intervalo é exactamente igual ao int?
*Porque está se baseando em computadores mais antigos que só conseguiam atingir até 32 bits (4 bytes). Atualmente os computadores domésticos já tem 64 bits e o int fica então com 32 e o long int com 64 (8 bytes).
== Números de ponto flutuante ==
Os números de ponto flutuante são uma tentativa para guardar valores reais e tipo os fraccionários. Ao contrário dos números reais, os números representáveis pelo hardware são finitos.
A maneira como os tipos de ponto flutuante são armazenados é abstrata para o programador, entretanto, o hardware segue o padrão IEEE 754(Standard for Floating-Point Arithmetic).
'''Pergunta''': Como é que os números de ponto flutuantes são armazenados? e nesse caso como fazer para os fraccionários infinitos?
Table 2-3: Floating-point Number Data Types, Sizes, and Ranges
Linha 121 ⟶ 106:
|-
| double || 8 || ±1.7E-308 to ±1.7E308
|}
O armazenamento é feito usando notação científica binária.
Table 2-4: Scientific and E Notation Representations of Floating Point Values
Linha 141 ⟶ 122:
| 1,200,000,000 || 1.2 x 109 || 1.2E9
|}
Linha 149 ⟶ 129:
Tem o tamanho de um byte e tem apenas dois valores 0 e 1 que corresponde a true e false.
'''Pergunta''':
*A razão é que o computador usa no mínimo o byte não o bit.
Quando queremos guardar um valor o sistema operativo vai reservar uma quantidade x de bytes, numa posição dada na memória.
A quantidade reservada vai depender do que declararmos, ie da tipologia de dados, que queremos guardar. Recorde-se que gravar o valor 5 é diferente de ter 5,67. Por isso é natural que ocupe mais espaço em termos de memória
Portanto vou necessitar de apenas 1 byte para guardar uma letra que denominamos de char
Vou necessitar 4 bytes para poder ter de 0 to 4294967295.
== Todos ==
Linha 189 ⟶ 163:
Estes são na verdade os tipos de dados fundamentais. Nós vamos criar mais e vamos criar nós próprios, mas serão sempre baseados nestes.
Linha 197 ⟶ 168:
Dito de outra forma, tínhamos uma única fita composta de bits. Agora temos muitas fitinhas de bytes. como esse bytes estão ordenados, podemos logo ter um nº de identificação para cada byte – temos então as addesses.
==
Os vários locais na memória são identificados por um address, que tem uma lógica sequencial numerada. São necessários 16 bits para guardar o endereço de um byte. dito de outra forma são necessários 2 bytes para guardar a morada de um byte.
será isto verdade?!! isso quer dizer que se guardarmos os endereços de todos os bytes, só temos 1/3 da memória disponível para guardar valores. Bem isto é um pouco estanho, mas repare-se que apenas vamos guardar os addresses das variáveis reservadas. Depois as variáveis nem sempre são de 1 byte, por isso apenas iremos guardar o endereço do primeiro byte e não de todos. por fim faz sentido guardar o endereço de outro endereço?
Os endereços de memória (addresses) são normalmente expressos em linguagem hexadecimal (base 16, utilizam os 10 algarismos mais as 6 primeiras letras – de a a f - do alfabeto para fazerem as 16).
'''Pergunta''': Quando tivermos mais do que
*Sim. Com dois bytes o número de combinações é 256*256.
'''pergunta''': Qual a razão do computador usar apenas bytes como medida mínima? Será que não seria possível utilizar 7 bits ou 5 bits?
*Não é possível pelo fato do computador so intender 0 e 1 então no caso é impossível se ter um número ímpar de bits porque tudo tem que ter o 0 e o 1 por isso que tudo na informática evolui multiplicando-se por 2 (32, 64, 256, 512)
== Void ==
Void significa ausência. Nas linguagens de programação derivadas de C, que inclui C++, Java e D, '''void''' é uma palavra-chave usada para identificar que uma função retorna nenhum resultado através de "return". Ela é colocada no lugar de tipo de retorno da função. Em variações do C, '''void''' é usado também para indicar que uma função não recebe argumentos.
{{AutoCat}}
|