Programar em C/Tipos de dados: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
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++ |Indice]]
[[Programar em C++/Índice|Índice]]
[[Programar em C++: Introdução|Introdução]]
[[../Introdução|Introdução]]
[[Programar em C++: Compilação|Compilaçã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++ |Indice]]
[[Programar em C++/Índice|Índice]]
[[Programar em C++: Introdução|Introdução]]
[[../Introdução|Introdução]]
[[Programar em C++: Compilação|Compilaçã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

  1. Pergunta: porque é que existe o long, se o intervalo é exactamente igual ao int?
  2. Pergunta: Quando tivermos mais do que 216 bytes acrescenta-se um outro byte?
  3. 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?
  4. 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.

  1. Pergunta: o que é realmente o void. Uma explicação convincente