paulo1205
(usa Ubuntu)
Enviado em 07/12/2014 - 07:23h
NOTA: Eu sei que esta resposta está atrasada, e que o tópico já foi até fechado (e o autor inclusive removeu sua conta do VoL). Eu comecei a escrevê-la há uns dois dias, mas tive de interromper antes de concluí-la e poder enviá-la. Como eu já tinha gastado um bocado de tempo com ela, achei melhor enviá-la, mesmo atrasada, do que simplesmente descartar tudo. Quem sabe se não pode ser útil a alguém?
8bit escreveu:
Olá,
Tenho me dedicado bastante Ao aprendizado da linguagem C e gostaria de tirar algumas dúvidas:
O livro que mais me chamou a atenção e que estou usando para o meu aprendizado é "Linguagem C por Luis Damas", gostei muito do livro e foi a documentação com a qual mais me identifiquei, porém na página 31, me deparei com algumas questões que não consegui interpretar corretamente e me deixaram confuso espero que possam me ajudar. A questão é a seguinte:
1. Um inteiro tem um limite de armazenamento se o inteiro for de 2 bytes será de -32.768/32.768, e se for de 4 bytes -2.147.483.648/2.147.483.648, mas o que isso significa exatamente?
(Os limites que você colocou acima estão errados. Veja por quê mais abaixo.)
Bit é uma contração de
b inary digit , ou dígito binário. Os computadores usam um sistema de numeração com dois algarismos -- por isso o nome binário. A escolha do sistema binário é pela conveniência da construção: é muito fácil construir circuitos que realizam operações a partir de ou produzam saídas equivalentes a dois estados, tais como com corrente vs. sem corrente, ou com tensão mínima vs. com tensão máxima.
Apenas um bit não é suficiente para representar muita coisa. Para serem úteis, os computadores costumam agrupar bits em conjuntos chamados “palavras”, e conseguem realizar operações aritméticas numa só passada sobre todos os bits que compõem tais palavras. Diferentes tipos de processadores podem trabalhar com diferentes tamanhos de palavras, e alguns processadores são até capazes de operar com mais de um tamanho de palavra, dependendo da conveniência do usuário.
A escolha do tamanho da palavra usado por um processador depende de vários fatores de projeto de engenharia, do tipo custo×benefício. Palavras muito pequenas têm a desvantagem de permitir a representação de poucos números. Por outro lado, quanto maior a palavra, mais complicado fica o projeto e o custo do processador, pois para trabalhar com mais bits ao mesmo tempo ele precisará de mais transistores, requerendo mais espaço físico, consumindo mais energia, gerando mais calor etc.
Alguns tamanhos comuns de palavras são 4 bits (chamada às vezes de “nibble” ou “nyble”), 8 bits (também chamada “byte”), 9 bits, 12 bits, 16 bits, 18 bits, 22 bits, 32 bits, 36 bits e 64 bits. Alguns autores chamam de “byte” a palavra nativa de uma arquitetura ou o tamanho usado para representar caracteres de texto (nem sempre os dois são equivalentes), mesmo quando tais tamanhos não são exatamente 8 bits. Alguns, para evitar confusão, preferem referir-se a palavras de 8 bits através do termo “octeto”.
Como eu disse acima, o tamanho da palavra influencia quais operações podem ser realizadas “numa só passada”, ou com uma única instrução, que é a maior eficiência possível dessas operações num dado processador. O valores dos operandos envolvidos nessa operações de máxima eficiência são limitados pelo tamanho da palavra. Assim, numa arquitetura com palavras de
N bits, existem
2^N possíveis valores inteiros, que geralmente vão de
0 a
2^N-1 para números inteiros sem sinal, ou de
-2^(N-1) até
+2^(N-1)-1 para números inteiros com sinal. Tais faixas de operação são obviamente uma redução absurda do verdadeiro espaço dos números inteiros, que é infinito, mas felizmente, na esmagadora maioria das aplicações, as pessoas ou não trabalham com números absurdamente grandes ou, quando trabalham, nem sempre necessitam de precisão absoluta. Se for necessário trabalhar com números que excedem o tamanho da palavra, é preciso construir programas que consigam dividir os números grandes em partes menores, que possam ser mapeadas nas palavras nativas, e operar separadamente sobre essas partes menores, juntando depois os resultados parciais.
O livro que você está usando deve ser um pouco antigo, já que ele menciona palavras de 16 bits como caso comum, e de 32 bits como exemplo maior. Nossos PCs já trabalham com 32 bits como tamanho nativo de palavras há mais de duas décadas, e até nossos celulares mais simples trabalham com 32 bits por padrão. Hoje, 64 bits virou o lugar comum nos PCs, e celulares de 64 bits estão em vias de assumir o primeiro lugar no mercado -- se é que já não o fizeram. Com 64 bits, você conta de 0 a 18.446.744.073.709.551.615 (mais de 18 quintilhões) ou de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Nem sempre você precisa disso tudo. Se você quiser, pode, nos nossos PCs, operar com palavras menores, de 32 bits (0 a 4.294.967.295, ou -2.147.483.648 a 2.147.483.647), 16 bits (0 a 65.535 ou -32.768 a 32.767) ou mesmo 8 bits (0 a 255 ou -128 a 127), mas o fato de usar essas palavras menores, ainda que lhe permita economizar memória, geralmente não lhe dará ganhos diretos de tempo de processamento.
2. Outra questão que também não interpretei muito bem foi em relação a essas unidades chamadas bits, mas pelo que eu li 8bits equivale a 1byte correto? Por exemplo: Letra a=01000001, possuindo 8 caracteres binários = 1byte, sendo assim a letra "a" equivale a 1byte??? Então se uma variável int só pode armazenar 2 ou 4bytes ela só pode ter no máximo 4 caracteres? Realmente estou confuso em relação a essa parte do livro.
Essa questão está ligada à anterior. A explicação sobre tamanhos de palavras já foi dada acima. Espero que você a tenha entendido.
Cuidado com o termo “caracteres”. No caso, o melhor seria você chamar de “dígitos binários” ou de “bits”. Em tempo, o byte indicado pela representação binária 01000001, ou 65 em notação decimal, corresponde, de acordo com o ASCII, ao caráter 'A', não ao 'a' (cujo índice ASCII é 97, ou 01100001).
O tipo
int do C (e do C++) possui, nos nossos PCs, 32 bits, ou 4 bytes. Para escrevê-lo usando algarismos
0 ou
1 do sistema de numeração binário, você precisaria de uma representação com 32 posições. Mas, de novo, cuidado com o nome “caracteres”.
3. A terceira e última dúvida é em relação aos blocos de código, pois tentei escrever e executar dois blocos de código cada um com uma tarefa específica, compilou sem quaisquer erros, mas o programa só executou o bloco main.
Você não mostrou como foram escritos esses blocos.
Blocos num programa em C servem para os seguintes propósitos:
1) Definir campos de um tipo agregado de dados (
struct ,
union ).
struct exemplo {
int i;
char ch;
};
2) Definir valores iniciais de um array.
int exemplo[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
3) Definir valores de uma enumeração.
enum cores {preto, vermelho, verde, amarelo, azul, magenta, ciano, branco};
4) Definir a implementação de uma função.
unsigned fatorial(unsigned n){
return n<=1u? 1u: n*fatorial(n-1u);
}
5) Agrupar múltiplos comandos em uma estrutura de controle de fluxo (
if /
else ,
for ,
while etc.), que de outra forma executariam um único comando.
if(i<0){
/* Múltiplos comandos: requer bloco. */
i=-i;
overflow=1;
}
else
break; /* Um só comando: não precisa de bloco. */
6) Dentro de (4) ou (5), limitar o escopo de visibilidade de variáveis.
unsigned fatorial(unsigned n){
/* ‘produto’ só é visível dentro do bloco que define ‘fatorial’ */
unsigned produto=1u;
while(n>=2)
produto*=n--;
return produto;
}