Programar em C/Tipos de dados: diferenças entre revisões
[edição não verificada] | [edição não verificada] |
Sem resumo de edição |
Ajustando links... |
||
Linha 1: | Linha 1: | ||
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left: |
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left: |
||
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%"> |
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%"> |
||
[[Programar em C++ |
[[Programar em C++/Índice|Índice]] |
||
[[ |
[[../Introdução|Introdução]] |
||
[[ |
[[../Compilação|Compilação]] |
||
[[../Alô, Mundo!|Alô, Mundo!]] |
|||
[[Programar em C++: 1º programa|1º programa]] |
|||
[[Programar em C++: Tipologia de dados|Tipologia de dados]] |
[[Programar em C++: Tipologia de dados|Tipologia de dados]] |
||
[[Programar em C++: Variáveis|Variáveis]] |
[[Programar em C++: Variáveis|Variáveis]] |
||
Linha 31: | Linha 32: | ||
[[Programar em C++: STL-Standard Template Library|STL-Standard Template Library]] |
[[Programar em C++: STL-Standard Template Library|STL-Standard Template Library]] |
||
</div> |
</div> |
||
---- |
---- |
||
== Tipos de memória: == |
== Tipos de memória: == |
||
Linha 270: | Linha 269: | ||
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left: |
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left: |
||
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%"> |
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%"> |
||
[[Programar em C++ |
[[Programar em C++/Índice|Índice]] |
||
[[ |
[[../Introdução|Introdução]] |
||
[[ |
[[../Compilação|Compilação]] |
||
[[../Alô, Mundo!|Alô, Mundo!]] |
|||
[[Programar em C++: 1º programa|1º programa]] |
|||
[[Programar em C++: Tipologia de dados|Tipologia de dados]] |
[[Programar em C++: Tipologia de dados|Tipologia de dados]] |
||
[[Programar em C++: Variáveis|Variáveis]] |
[[Programar em C++: Variáveis|Variáveis]] |
||
Linha 302: | Linha 301: | ||
---- |
---- |
||
[[Categoria:Programar em C++|Tipologia de dados]] |
[[Categoria:Programar em C++|Tipologia de dados]] |
Revisão das 00h26min de 14 de novembro de 2006
Tipos de memória:
Existem 3 tipos principais de locais de memória no computador:
- The central processing unit (CPU) – cache memory
- O 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.
- O 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:
- Heap
- Buffer
- Register. Contem dados específicos para arithmetic and logic Unit (ALU)
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
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 voltagem: tem voltagem ou não tem voltagem: se tem voltagem associamos o valor 1, se não tem voltagem associamos o valor 0. Daí termos a linguagem binária de zeros e uns.
Agora podemos fazer combinações se tivermos posição de zeros e uns, da direita para a esquerda.
- 00000000 1ª Combinação
- 00000001 2ª Combinação
- 00000010 3ª Combinação
- 00000011 4ª Combinação
- 00000100 5ª Combinação
- 00000101 6ª Combinação
- 00000110 7ª Combinação
- 00000111 8ª Combinação
- …
E na verdade podemos estender este conceito para um número infinito de combinações.
Ora o que aconteceu é que nos bastavam pouco menos de 256 combinações (8 bits ordenados) para termos uma combinação para cada letra, maiúscula e minúscula, número, pontos de exclamação, interrogação, etc. …e isso era o suficiente para a nossa comunicação. Mas para haver um certo consenso para que uma dada combinação desse um dado símbolo surgiu a tabela ASCII (surgiram outras tabelas quando se quis colocar os símbolos de outras línguas, como o japonês ou o chinês – ver tabela ISO)
Portanto com 8 bits ou 8 casas conseguíamos ter qualquer símbolo que utilizamos. A esse conjunto de 8 bits chamamos de byte, mais convenientemente. Portanto, um byte tem 8 casas de zeros /uns , ou seja 2 elevado a 8 dá as 256 combinações. E o byte é a unidade básica que o C++ consegue operar. Isto iria dar a tipologia char então já temos explicado uma das tipologias
Texto
(tipologia de dado) (char) 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 216=65 536 e isso dar-nos-ia esses números todos.
Assim se quisermos apenas os positivos com o zero temos de [0, 65535]
Se quisermos ter números negativos e positivos podemos dividir esse valor a meio e dá 32768 para cada lado positivo e negativo, mas como temos de ter o zero vamos roubar um valor ao lado positivo e então ficamos com o intervalo [-32768, 32767]. e ficamos com as mesmas 65 536 combinações.
eu apresentei o int com 2 bytes, mas eles podem ter 4 bytes, isso vai depender do processador do computador, ie, com quantos bytes consegue ele lidar ao mesmo tempo. para para desenvolver este tema ver sistema operativo
Aqui está um quadro com as variantes do int: signed/insigned; short/long. isto são os specifiers ou modifiers, porque alteram especificam de acordo com a necessidade
Table 2-2: Whole Number Data Types, Sizes, and Ranges
Data Type | Size (in Bytes) | Range (in E notation) |
short | 2 | –32,768 to 32,767 |
unsigned short | 2 | 0 to 65,535 |
int | 4 | –2,147,483,648 to 2,147,483,647 |
unsigned int | 4 | 0 to 4,294,987,295 |
long | 4 | –2,147,483,648 to 2,147,483,647 |
unsigned long | 4 | 0 to 4,294,987,295 |
Pergunta: porque é que existe o long, se o intervalo é exactamente igual ao int?
Floating Numbers
Os floating numbers são uma tentativa para guardar valores reais, tipo os fraccionários finitos e infinitos Não consegui perceber como é que os floating numbers são armazenados. se é como um número (e aí como é feito a virgula) ou se é tipo fracção de 2 inteiros ou ainda se é outro sistema: tipo
Pergunta: como é que os floating numbers são armazenados? e nesse caso como fazer para os fraccionários infinitos? Table 2-3: Floating-point Number Data Types, Sizes, and Ranges
Data Type | Size (in Bytes) | Range (in E notation) |
float | 4 | ±3.4E-38 to ±3.4E38 |
double | 8 | ±1.7E-308 to ±1.7E308 |
long | 10 | ±3.4E-4932 to ±3.4E4932 |
Uma outra hipótese é o uso da notação cientifica ou ainda com a notação e notation Table 2-4: Scientific and E Notation Representations of Floating Point Values
Decimal Notation | Scientific Notation | E Notation |
123.45 | 1.2345 x 102 | 1.2345E2 |
0.0051 | 5.1 x 10-3 | 5.1E-3 |
1,200,000,000 | 1.2 x 109 | 1.2E9 |
Bool
Esta tipologia surgiu porque muitas vezes apenas se quer ter 2 valores: sim/não ; verdadeiro/falso. Tem o tamanho de um byte e tem apenas dois valores 0 e 1 que corresponde a true e false.
Pergunta: porquê guardar um bool num byte quando se pode utilizar apenas um bit? 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. (é natural que quanto maior for o número seja necessário mais combinações de bits e bytes)
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
Name | Description | Size* | Range* |
char | Character or small integer | 1byte | signed: -128 to 127 unsigned: 0 to 255 |
int | Integer | Size* | signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295* |
short int ou short | Short Integer | 2bytes | signed: -32768 to 32767 unsigned: 0 to 65535 |
long int ou long | Long integer | 4bytes | signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295 |
bool | Boolean value It can take one of two values: true or false | 1byte | true or false |
float | Floating point number | 4bytes | 3.4e +/- 38 (7 digits) |
double | Double precision floating point number. | 8bytes | 1.7e +/- 308 (15 digits) |
long double | Long double precision floating point number | 8bytes | 1.7e +/- 308 (15 digits) |
wchar_t | Wide character | 2bytes | 1 wide character |
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.
Então antes podíamos pensar na memória do PC como um conjunto de n bits ordenados de memória, Agora podemos pensar em n/8 bytes de memória. Temos 1º byte, 2º byte, …. m byte. 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.
Addresses
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 216 bytes acrescenta-se um outro byte?
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 impar 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
há mais uma nota que gostaria de fazer que é sobre a tipologia void! void significa ausência. que não tem tipo.
há uma polémica muito grande sobre o uso do void como tipologia de retorno da função main(). acontece que o void pode ser realemente usado como uma tipologia normal excepto no main(). como o main() é uma função especial é exigido a esta função que retorne sempre um valor.
há mais um ponto: o void não significa que a variavel não tem qualquer tipologia mas antes diz que não quero saber sobre a tipologia da variavel. o que é diferente
ainda não percebi bem a vantagem do void mas.
Pergunta: o que é realmente o void. Uma explicação convincente Void é um programa que foi feito para não retornar absolutamente nada so foi feito para executar comandos.
Perguntas
- Pergunta: porque é que existe o long, se o intervalo é exactamente igual ao int?
- Pergunta: Quando tivermos mais do que 216 bytes acrescenta-se um outro byte?
- 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?
- Pergunta: porquê guardar um bool num byte quando se pode utilizar apenas um bit?
A razão é que o computador usa no mínimo o byte não o bit.
- Pergunta: o que é realmente o void. Uma explicação convincente