cap3-sistema-de-numeracao.asc 36.1 KB
Newer Older
1
[[cap_sistemas_numeracao]]
2
== Sistemas de numeração
3

4
5
:cap: cap3

6
7
8
9
.Objetivos do capítulo
____________________
Ao final deste capítulo você deverá ser capaz de:

10
11
12
13
14
* Entender a origem dos sistemas de numeração na história
* Explicar o funcionamento do sistema de numeração binário
* Ser capaz de efetuar operações da aritmética e lógica binária
* Compreender como a lógica binária permite criar operações mais complexas 
no computador
15
16
17
18
19
20
21
22
23
24
25
____________________


Um numeral é um símbolo ou grupo de símbolos que representa um número em um 
determinado instante da história humana. Tem-se que, numa determinada escrita 
ou época, os numerais diferenciaram-se dos números do mesmo modo que as 
palavras se diferenciaram das coisas a que se referem. Os símbolos "11", 
"onze" e "XI" (onze em latim) são numerais diferentes, representativos do 
mesmo número, apenas escrito em idiomas e épocas diferentes. Este capítulo 
debruça-se sobre os vários aspectos dos sistemas de numerais.

26
Entraremos em mais detalhes sobre o sistema de numeração binária devido a 
27
28
29
30
31
sua utilização nos computadores, permitindo assim, que o mesmo realize 
pequenas operações aritméticas que servirão como base para grandes 
operações como busca, ordenação e indexação de informação entre outras 
operações comuns do dia a dia. 

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
32
=== Noções de Sistema de Numeração
33

34
(((Sistema de Numeração)))
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Há milhares de anos o modo de vida era muito diferente do atual. Os homens 
primitivos não tinham necessidade de contar. Eles não compravam, não 
vendiam, portanto não usavam dinheiro.

Com o passar dos anos, os costumes foram mudando e o homem passou a cultivar a 
terra, a criar animais, a construir casas e a comercializar. Com isso, surgiu a 
necessidade de contar.

A vida foi tornando-se cada vez mais complexa. Surgiram as primeiras aldeias 
que, lentamente, foram crescendo, tornando-se cidades. Algumas cidades se 
desenvolveram, dando origem às grandes civilizações. Com o progresso e o 
alto grau de organização das antigas civilizações, a necessidade de 
aprimorar os processos de contagem e seus registros tornou-se fundamental.

Foram criados, então, símbolos e regras originando assim os diferentes 
sistemas de numeração. 

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
53
==== Sistema de numeração Egípcio (3000 a.C.) 
54
55

Um dos primeiros sistemas de numeração que temos conhecimento é o egípcio, 
56
que foi desenvolvido pelas civilizações que viviam no vale do Rio Nilo, ao 
57
58
nordeste da África.

59
Observem, na <<sistema_egipcio>>, os símbolos e a representação de alguns números 
60
61
nesse sistema de numeração.

62
63
[[sistema_egipcio]]
.Sistema de Numeração Egípcio
64
image::images/{cap}/sistema_egipicio.eps[scaledwidth="70%"]
65

66
67
68
69
70

Este sistema adota o princípio aditivo, ou seja, os símbolos possuem seus 
respectivos valores individuais e juntos passam a formar novos valores pela 
simples adição destes.

71
==== Sistema de numeração Babilônico (2000 a.C.) 
72

73
Os babilônios viviam na Mesopotâmia, nos vales dos rios Tigres e Eufrates, 
74
75
76
na Ásia. Esta região é ocupada atualmente pelo Iraque.

Na escrita dos números, o sistema de numeração dos babilônios se parecia 
77
muito com o sistema de numeração desenvolvido pelos egípcios, ambos eram 
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
78
aditivos. Observe, na <<fig_sistema_babilonico>>, os símbolos e a representação de alguns 
79
80
números, de 7 a 59, nesse sistema de numeração.

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
81
[[fig_sistema_babilonico]]
82
.Sistema de Numeração Babilônico
83
image::images/{cap}/sistema_babilonico.eps[scaledwidth="70%"]
84

85
[NOTE]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
86
==================
87
Agora é com você. Qual seria o valor que cada símbolo babilônico, seguindo 
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
88
os exemplos da <<fig_sistema_babilonico>>?
89

90
image:images/{cap}/um_babilonico.eps[] = ?
91

92
image:images/{cap}/dez_babilonico.eps[] = ?
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
93
==================
94

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
95
==== Sistema de numeração Romano 
96
97
98
99
100
101
102
103
104
105
106

O sistema de numeração romano, apesar das dificuldades operatórias que 
apresentava, foi utilizado na Europa durante muitos séculos. Esse sistema de 
numeração foi desenvolvido pela civilização romana, cuja sede era a cidade 
de Roma, situada na Itália.

Ainda hoje, utilizamos esse sistema de numeração em algumas situações, tais 
como:

- na designação de papas e reis;
- na designação de séculos e datas;
107
108
- na indicação de capítulos e volumes de livros;
- nos mostradores de alguns relógios, etc. 
109

110
Com o passar dos anos, o sistema de numeração romano (<<sistema_romano>>) sofreu um longo processo 
111
 de evolução. Inicialmente, os romanos utilizavam apenas o principio aditivo, 
112
sendo que um mesmo símbolo podia ser repetido até, no máximo, quatro vezes.  
113
114
115
116
Posteriormente, eles evoluíram este sistema, passando a utilizar também o 
princípio subtrativo, além de permitir a repetição de um mesmo símbolo, no 
máximo, três vezes.

117
118
[[sistema_romano]]
.Sistema de Numeração Romano
119
image::images/{cap}/sistema_romano.eps[scaledwidth="60%"]
120
121


122
==== Sistema de numeração Indo-Arábico  
123

124
125
126
127
Os hindus, que viviam no vale do Rio Indo, onde hoje é o Paquistão, 
conseguiram desenvolver um sistema de numeração que reunia as diferentes 
características dos antigos sistemas.

128
Tratava-se de um sistema posicional decimal. Posicional porque um mesmo 
129
130
131
132
símbolo representava valores diferentes dependendo da posição ocupada, e 
decimal porque era utilizado um agrupamento de dez símbolos.

Esse sistema posicional decimal, criado pelos hindus, corresponde ao nosso 
133
atual sistema de numeração, já estudado por você nas séries do ensino fundamental.  
134
135
136
Por terem sido os árabes os responsáveis pela divulgação desse sistema. Ele 
ficou conhecido como sistema de numeração indo-arábico. Os dez símbolos, 
utilizados para representar os números, denominam-se algarismos 
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
137
138
indo-arábicos. São eles: 

139
140
141
142
143
[frame='none', cols="^,^,^,^,^,^,^,^,^,^"]
|====
| 0 | 1| 2| 3| 4| 5| 6| 7| 8| 9
|====

144

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
145
146
[TIP]
==========
Eduardo de Santana Medeiros Alexandre's avatar
foot    
Eduardo de Santana Medeiros Alexandre committed
147
148
Veja, na <<fig_sistema_indo_arabico>>footnote::[Fonte: http://www.programandoomundo.com/Sistema%20Indo-Arabico.htm.], as principais mudanças ocorridas nos símbolos 
indo-arábicos, ao longo do tempo.  
149

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
150
[[fig_sistema_indo_arabico]]
151
.Sistema de numeração Indo-Arábico
152
image::images/{cap}/sistema_arabico.eps[scaledwidth="70%"]
153
154

Observe que, inicialmente, os hindus não utilizavam o zero. A criação de um 
155
símbolo para o *nada*, ou seja, o zero, foi uma das grandes invenções dos 
156
hindus. 
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
157
==========
158

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
159
=== Sistema de Numeração Posicional
160
161
162

O método de numeração de quantidades ao qual estamos acostumados, utiliza um 
sistema de numeração posicional. Isto significa que a posição ocupada por 
163
164
165
166
167
168
cada algarismo em um número altera seu valor de uma potência de 10 (na base 
10) para cada casa à esquerda.

Por exemplo:

No sistema decimal (base 10), no número 125 o algarismo 1 representa 100 (uma 
169
centena ou 10^2^), o 2 representa 20 (duas dezenas ou 2 x 10^1^), o 5 representa 5 
170
mesmo (5 unidades ou 5x10^0^). 
171
172
173

Assim, em nossa notação:

174
175
176
____
125 = 1×10^2^ + 2×10^1^ + 5×10^0^
____
177

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
178
==== Base de um Sistema de Numeração
Eduardo de Santana Medeiros Alexandre's avatar
35    
Eduardo de Santana Medeiros Alexandre committed
179

180
(((Sistema de Numeração)))
181

182
183
184
185
186
187
A base de um sistema é a quantidade de algarismos disponíveis na 
representação. A base 10 é hoje a mais usualmente empregada, embora não 
seja a única utilizada. No comércio pedimos uma dúzia de rosas (base 12) e 
marcamos o tempo em minutos e segundos (base 60).

Quando lidamos com computadores, é muito comum e conveniente o uso de outras 
188
bases, as mais importantes são a binária (base 2), octal (base 8) e hexadecimal 
189
190
191
192
193
194
(base 16).

Um sistema numérico de base k precisa de k símbolos diferentes para 
representar seus dígitos de 0 a k-1. Os números decimais são formados a 
partir de 10 dígitos decimais:

195
(((base decimal)))
196

197
198
199
200
____
`0  1  2  3  4  5  6  7  8  9`
____

201
202
203

Já os números na base binária são representados a partir de dois dígitos:

204
(((base binária)))
205

206
207
208
____
`0  1`
____
Eduardo de Santana Medeiros Alexandre's avatar
35    
Eduardo de Santana Medeiros Alexandre committed
209

210
211
O octal necessita de oito:

212
(((base octal)))
213

214
215
216
____
`0  1  2  3  4  5  6  7`
____
Eduardo de Santana Medeiros Alexandre's avatar
35    
Eduardo de Santana Medeiros Alexandre committed
217

218
No caso de números hexadecimais, são necessários 16 algarismos. Portanto, 
219
220
serão mais 6 símbolos além dos dez algarismos arábicos. Em geral, usam-se as 
letras maiúsculas de A a F:
221

222
223
224
____
`0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F`
_____
Eduardo de Santana Medeiros Alexandre's avatar
35    
Eduardo de Santana Medeiros Alexandre committed
225

226
	
Eduardo de Santana Medeiros Alexandre's avatar
35    
Eduardo de Santana Medeiros Alexandre committed
227
228
A representação 318~10~ (base 10), significa:

229
230
231
____
318~10~ = 3×10^2^ + 1×10^1^ + 8×10^0^
____
232
233
234
235
236


Generalizando, representamos uma quantidade N qualquer, numa dada base b, com 
um número tal como segue:

237
238
239
____
N~b~ = a~0~ × b^n^  + a~1~ × b^n-1^ + ... + a~n~ × b^0^
____
240
241


242
Abaixo, o número 35 será expresso nas bases elencadas acima:
243

244
(((Decimal)))(((Binário)))(((Octal)))(((Hexadecimal)))
245

246
Decimal:: 35 = 3×10^1^ + 5×10^0^ = 30 + 5 = 35~10~
247

248
Binário:: 35 = 1×2^5^  + 0×2^4^  + 0×2^3^ + 0×2^2^ + 1×2^1^ + 1×2^0^  = 32 + 0 + 0 + 0 + 2 + 1 = 100011~2~
249

250
Octal:: 35 = 4×8^1^  + 3×8^0^ = 32 + 3 = 43~8~
251

252
Hexadecimal:: 35 = 2×16^1^  + 3×16^0^ = 32 + 3 = 23~16~
253

254
255
256
257
258
259
260

[NOTE]
====
Usualmente *bytes* são representados utilizando o sistema *hexadecimal*,
pois eles são mais fáceis de manipular por programadores. Por exemplo, a sequência de bits `0010 0011`
que corresponde ao número 35~10~, é expressa por `0x23` em hexadecimal.

261
262
Nas linguagens de programação os números *hexadecimais* costumam ser representados com o prefixo `0x` e os octais com o prefixo `0`.

263
264
Portando `23` representa o número 23, enquanto `0x23` é um valor *hexadecimal* que corresponde ao decimal 35 e `023` é um valor
*octal* que corresponde ao decimal 19.
265
266
====

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
267
=== Conversões entre bases
268
269
270
271

Nesta seção iremos  analisar as regras gerais para converter números entre 
duas bases quaisquer.

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
272
==== Conversões entre as bases 2, 8 e 16
273

274
275
As conversões mais simples são as que envolvem bases que são potências 
entre si. Vamos exemplificar com a conversão entre a base 2 e a base 8. Como 
276
2^3^ = 8, então a conversão funciona da seguinte forma: separando os algarismos 
277
278
279
280
281
282
de um número binário (base 2) em grupos de três algarismos (começando 
sempre da direita para a esquerda) e convertendo cada grupo de três algarismos 
para seu equivalente em octal, teremos a representação do número em octal.

Por exemplo:

283
284
285
____
10101001~2~ = 010 . 101 . 001~2~
____
286
287
288

Olhando a tabela de conversão direta temos:

289
(((Octal)))
290

291
.Conversão direta de binário para octal e vice-versa
292
[width="50%", frame="none", grid="all", cols="^1,^1", options="header"]
293
294
295
296
297
298
299
300
301
302
303
|=================================
| Binário | Octal
| 000 | 0
| 001 | 1
| 010 | 2
| 011 | 3
| 100 | 4
| 101 | 5
| 110 | 6
| 111 | 7
|=================================
304
305
306

Logo: 

307
[cols="^,^,^,^", frame="none"]
308
|==============
309
| 010~2~ = 2~8~ | 101~2~ = 5~8~ |  001~2~ = 1~8~ | 10101001~2~ = 251~8~
310
|==============
311

312

313
Vamos agora exemplificar com uma conversão entre as bases 2 e 16. Como 2^4^ = 
314
16, seguindo o processo anterior, basta separarmos em grupos de quatro algarismos e 
315
converter cada grupo seguindo a <<tabela_binario_hexa>>.
316
317

Por exemplo:
318

319
320
321
____
11010101101~2~ = 0110 . 1010 . 1101~2~
____
322
323
324

Olhando a tabela de conversão direta temos:

325
(((Hexadecimal)))
326

327
328
[[tabela_binario_hexa]]
.Conversão direta de binário para hexadecimal e vice-versa.
329
[width="70%", frame="none", grid="all", cols="^1,^1,^1,^1", options="header"]
330
331
332
333
334
335
336
337
338
339
340
341
342
|=================================
| Binário | Hexadecimal | Binário | Hexadecimal 
| 0000    | 0 | 1000 | 8 
| 0001    | 1 | 1001 | 9
| 0010    | 2 | 1010 | A
| 0011    | 3 | 1011 | B
| 0100    | 4 | 1100 | C
| 0101    | 5 | 1101 | D
| 0110    | 6 | 1110 | E
| 0111    | 7 | 1111 | F
|=================================


343
344

Logo:
345
[cols="^2,^2,^2,^3", frame="none"]
346
|==============
347
| 0110~2~ = 6~16~ | 1010~2~ = A~16~ |  1101~2~ = D~16~ | 	11010101101~2~ = 6AD~16~
348
349
|==============

350
351
352
353

Vamos agora analisar a conversão inversa.

Por exemplo:
354

355
356
357
____
A81~16~ = A . 8 . 1~16~
____
358

359
Sabemos que:
360

361
[cols="^,^,^", frame="none"]
362
363
364
365
|==============
| A~16~ = 1010~2~ | 8~16~ = 1000~2~ | 1~16~ = 0001~2~
|==============

366
Portanto:
367

368
369
370
____
A81~16~ = 101010000001~2~
____
371

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
372
==== Conversão de números em uma base b qualquer para a base 10.
373

374
Vamos lembrar a expressão geral já apresentada:
375

376
377
378
____
N~b~ = a~0~ × b^n^  + a~1~ × b^n-1^ + ... + a~n~ × b^0^
____
379

380
381
A melhor forma de fazer a conversão é usando essa expressão. Como exemplo, o 
número 101101~2~ terá calculado seu valor na base 10:
382

383
384
385
____
101101~2~ = 1×2^5^  + 0×2^4^  + 1×2^3^ + 1×2^2^ + 0×2^1^ + 1×2^0^ = 45~10~ 
____
386
	
387
388
Outros exemplos:

389
Converter A5~16~ para a base 10:
390

391
392
393
____
A5~16~ = 10×16^1^  + 5×16^0^  =  160 + 5 = 165~10~
____
394

395
Converter 485~9~ para a base 10:
396

397
398
399
____
485~9~ = 4×9^2^  +8×9^1^  + 5×9^0^  = 324 + 72 + 5 = 401~10~
____
400

401

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
402
==== Conversão de números da base 10 para uma base b qualquer
403

404
405
406
A conversão de números da base 10 para uma base qualquer, emprega algoritmos 
que serão o inverso dos anteriores. O número decimal será dividido 
sucessivas vezes pela base, o resto de cada divisão ocupará sucessivamente as 
407
posições de ordem 0, 1, 2 e assim por diante, até que o resto da última 
408
409
divisão (que resulta em quociente 0) ocupe a posição de mais alta ordem.

410
- Conversão do número 19~10~ para a base 2:
411

412
image::images/{cap}/conversao-fazendo-divisao.eps[scaledwidth="70%", width="50%"]
413
414


415
416
Logo temos: 

417
418
419
____
19~10~ = 10011~2~
____
420
421
422
423

 
Usando a conversão anterior como prova real, temos:

424
425
426
____
10011~2~ = 1×2^4^  + 0×2^3^ + 0×2^2^ + 1×2^1^ + 1×2^0^ = 19~10~
____
427
428
429
430


Conversão do número 278~10~ para a base 16:

431
image::images/{cap}/278_16.eps[scaledwidth="50%", width="50%"]
432

433
434
Logo temos: 

435
436
437
____
278~10~  = 116~16~
____
438

439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
=== Aritmética Binária

Como o computador manipula os dados (números) através de uma representação 
binária, iremos estudar agora a aritmética do sistema binário, a mesma usada 
pela ULA (Unidade Lógica e Aritmética) dos processadores.

[[sec_soma_binaria]]
==== Soma e Subtração Binária

(((Soma binária)))(((Subtração binária)))

A tabuada da soma aritmética binária:

  0 + 0 = 0
  0 + 1 = 1
  1 + 0 = 1
  1 + 1 = 0 (e “vai um” para o dígito de ordem superior)  
  1 + 1 + 1 = 1 (e “vai um” para o dígito de ordem superior)  

Por exemplo: 

____
Efetuar 011100~2~ + 011010~2~ 
____

NOTE: Soma-se as posições da direita para esquerda, tal como uma soma decimal.

Solução:

468
image::images/{cap}/figura1.eps[scaledwidth="40%"]
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485

A tabuada da subtração aritmética binária:

 0 - 0 = 0
 0 - 1 = 1 (“vem um do próximo”)
 1 - 0 = 1
 1 - 1 = 0

NOTE: Como é impossível tirar 1 de 0, o artifício é ``pedir emprestado'' 1 
da casa de ordem superior, ou seja, na realidade o que se faz é subtrair 1~2~ de 
10~2~ e encontramos 1~2~ como resultado, devendo então subtrair 1 do dígito de 
ordem superior. Este algoritmo é exatamente o mesmo da subtração em decimal.

Por exemplo: 	11100~2~ – 01010~2~ = ?

Solução:

486
image::images/{cap}/figura2.eps[scaledwidth="25%"]
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525

NOTE: Não esqueça, subtrai-se as colunas da direita para a esquerda, tal como 
uma subtração decimal.

Você pode assistir uma aula sobre soma e subtração binária no vídeo a seguir.

.Vídeo sobre Soma e Subtração Binária: http://youtu.be/NeQBC9Z5FHk
ifdef::livro-pdf[]
["qrcode", size=10, scaledwidth="30%"]
-------------------------
http://youtu.be/NeQBC9Z5FHk
-------------------------
endif::livro-pdf[]
ifdef::livro-html[]
+++
<?dbhtml-include href="videos/aritmeticaBinaria.html"?>
+++
endif::livro-html[]


==== Multiplicação e divisão binária

(((Multiplicação binária)))

Vamos ver agora a tabuada da multiplicação:

	0 x 0 = 0
	0 x 1 = 0
	1 x 0 = 0
	1 x 1 = 1

NOTE: O processo de multiplicação binário é idêntico ao decimal.

Exemplo: 	

Efetuar: 101~2~ x 110~2~

Solução:

526
image::images/{cap}/figura5.eps[scaledwidth="40%"]
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555

No entanto, a multiplicação em computadores é feita, também, por um 
artifício: para multiplicar A por n somamos A com A (n-1) vezes. 

Exemplo:

____
4 x 3 = 4 + 4 + 4 = 12
____


E a divisão também pode ser feita por subtrações sucessivas, até o 
resultado zerar ou ficar negativo. Este artifício serve apenas para divisões 
inteiras.

Por exemplo:

____
16 ÷ 4 -> 16 *- 4* = 12 -> 12 *- 4* = 8 -> 8 *- 4* = 4 -> 4 *– 4* = 0
____


O número de subtrações indica o resultado da divisão inteira, neste caso, 
igual a 4.

NOTE: Podemos concluir que qualquer operação aritmética pode ser realizada em 
computadores através de somas (diretas ou em complemento). Com isso 
diminui-se o número de circuitos lógicos de operações para o processador.

Eduardo de Santana Medeiros Alexandre's avatar
notas    
Eduardo de Santana Medeiros Alexandre committed
556
[[sec_numeros_negativos]]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
557
=== Números Binários Negativos
558

559
(((Negativo)))
560

561
562
563
Os computadores lidam com números positivos e números negativos, sendo 
necessário encontrar uma representação para números com sinal negativo. 
Existe uma grande variedade de opções, das quais nesta seção serão 
564
apresentadas apenas três para representar valores negativos:
565

566
567
568
569
570
571
572
- Sinal e amplitude/magnitude (S+M)
- Complemento de 1
- Complemento de 2

A representação de **Complemento de 2** é a mais utilizada, mas para
compreendê-la é necessário primeiro conhecer as anteriores, que são
mais simples.
573

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
574
==== Sinal e Amplitude/Magnitude (S + M)
575

576
(((Sinal)))
577

578
Como o próprio nome indica, a representação *sinal* e *amplitude* é dividida em duas partes. Utiliza um bit 
579
para representar o sinal, o bit mais à esquerda: *0* para indicar um valor 
580
positivo, *1* para indicar um valor negativo. Já o resto dos bits representam seu valor absoluto.
581

582
image::images/{cap}/sinal_magnitude.eps[scaledwidth="40%", width="50%"]
583

Eduardo de Santana Medeiros Alexandre's avatar
base    
Eduardo de Santana Medeiros Alexandre committed
584

585
==== Complemento de 1
586

587
(((Complemento de 1)))
588

589
Na representação em complemento de 1 invertem-se todos os bits de um número 
590
para representar o seu complementar: assim, se converte um valor positivo para 
591
592
593
594
595
um negativo, e vice-versa. Quando o bit mais à esquerda é 0, esse valor é 
positivo; se for 1, então é negativo.

Exemplo: 

596
____
597
01100100~2~ = 100~10~
598
____
599
  
600
601
602

Invertendo todos os bits:

603
604
605
____
10011011~2~ = –100~10~
____
606

607

608
609
610
611
[IMPORTANT]
===============
O problema desta representação é que existem 2 padrões de bits para o 
0, havendo assim desperdício de representação:
612

613
614
615
____
0~10~ = 00000000~2~ = 11111111~2~
____
616

617
618
===============

619

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
620
==== Complemento de 2
621

622
(((Complemento de 2)))
623

624
Na representação do **complemento de 2** não há disperdiço.
625
Para determinar o negativo de um número, inverte-se todos os seus bits e 
626
627
628
soma-se uma unidade.

Exemplo:
629

630
Representação binária:: 101~10~ = 01100101~2~ (com 8 bits)
631

632
Invertendo todos os bits:: 10011010~2~
633

634
Somando uma unidade:: 10011011~2~ = 10011010~2~ + 1 = –101~10~
635

636

637
638
[IMPORTANT]
====
639
A representação em complemento para 2 tem as seguintes características:
640

641
642
643
- o bit da esquerda indica o sinal;
- possui processo para converter um número de positivo para negativo e de 
negativo para positivo;
644
- o 0 tem uma representação única: todos os bits iguais a 0;
645
- a gama de valores que é possível representar com n bits é -2^n-1^ ... 2^n-1^-1.
646
====
647
648
649

Exemplo:

650
651
Qual o número representado por 11100100~2~ (com 8 bits)?
Como o bit da esquerda é 1 este número é negativo. Invertendo todos os bits:
652

653
654
655
____
00011011~2~
____
656
  
657
658
659

Somando uma unidade:

660
661
662
____
00011011~2~ + 1 = 00011100~2~ = 28~10~
____
663
664
665

Logo:

666
667
668
____
11100100~2~ = – 28~10~
____
669

670
=== Circuitos nos computadores para realizar as operações
671
672
673

Na eletrônica digital de dispositivos tais como computadores, circuitos 
simples custam menos e operam mais rápido do que circuitos mais complexos. 
674
Logo, números em complemento de dois são usados na aritmética, pois eles 
675
676
permitem o uso dos circuitos mais simples, baratos e rápidos.

677
678
==== Circuito somador com complemento de 2

679
680
Uma característica do sistema de complemento de dois é que tanto os números 
com sinal quanto os números sem sinal podem ser somados pelo mesmo circuito. 
681
Por exemplo, suponha que você deseja somar os números sem sinal 132~10~ e 14~10~. 
682

683
image::images/{cap}/figura3.eps[scaledwidth="60%"]
684
685

O microprocessador tem um circuito na ULA (Unidade Lógica e 
686
Aritmética) que pode somar números binários sem sinal, quando aparece o 
687
688
padrão 10000100~2~ em uma entrada e 00001110~2~ na outra entrada, resulta 
10010010~2~ na saída.
689

690
Surge a pergunta: como a ULA sabe que os padrões de bits nas entradas 
691
692
693
694
695
representam número sem sinal e não números em complemento de dois? E a 
resposta é: não sabe. A ULA sempre soma como se as entradas fossem números 
binários sem sinal. Sempre produzirá o resultado correto, mesmo se as 
entradas forem números em complemento de dois.

696
image::images/{cap}/figura4.eps[scaledwidth="60%"]
697

698
Isto comprova um ponto muito importante. O somador na ULA sempre soma padrões 
699
700
de bits como se eles fossem números binários sem sinal. É a nossa 
interpretação destes padrões que decide se números com ou sem sinal estão 
701
sendo tratados. O bom do complemento de dois é que os padrões de bits podem 
702
ser interpretados de qualquer maneira. Isto nos permite trabalhar com números 
703
704
com e sem sinal sem requerer diferentes circuitos para cada padrão.

705
706
==== Circuito subtrator com complemento de 2

707
708
A aritmética de complemento de dois também simplifica a ULA em outro ponto. 
Todo microprocessador precisa da instrução de subtração. Assim, a ULA deve 
709
ser capacitada a subtrair um número de outro. Entretanto, se isto necessitar 
710
711
de um circuito de subtração separado, a complexidade e o custo da ULA seriam 
aumentados. Felizmente, a aritmética de complemento de dois permite a ULA, 
712
713
714
715
716
717
718
realizar operações de subtração usando um circuito somador. Ou seja, a CPU 
usa o mesmo circuito tanto para soma como para subtração.

Uma vez que o complemento de dois foi formado, a CPU pode realizar uma 
subtração indiretamente pela adição do complemento de dois do Subtraendo 
com Minuendo. Não esquecendo de ignorar o último transporte da adição.

719
Como exemplo temos a subtração de 69~10~ (Minuendo) por 26~10~ (Subtraendo).
720
721

Jogue fora o transporte final:
722

723
image::images/{cap}/transporte-final.eps[scaledwidth="100%"]
724

725
726
[NOTE]
====
727
728
729
730
Fica o desafio de descobrir porque o valor 74~10~ é o complemento de 10 do número
26~10~, a regra é análoga do complemento de 2 binária, ou seja, primeiro deve ser
feito o complemento de 9 para cada número individualmente e depois deve ser somado
o valor 1.
731
732
====

Eduardo de Santana Medeiros Alexandre's avatar
notas    
Eduardo de Santana Medeiros Alexandre committed
733
[[sec_ponto_flutuante]]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
734
=== Representação de Número Fracionário no Sistema Binário
735

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
736
==== Notação de Ponto Fixo
737

738
(((Ponto Fixo)))
739

740
741
Esta notação conhecida como Notação de Ponto Fixo, utiliza um ponto que 
funciona da mesma forma que o ponto da notação decimal. Em outras palavras, 
742
os dígitos à esquerda do ponto representam a parte inteira do valor, 
743
744
745
746
747
748
funcionando da mesma forma que a notação binária. E os dígitos à direita 
do ponto representam a parte não inteira, sendo o expoente da base 2 
decrementada em 1 a cada casa afastada do ponto.

Exemplo:

749
.Representação de ponto fixo
750
image::images/{cap}/ponto-fixo.eps[]
751

752
==== Soma e subtração de números fracionários
753
754
755
756
757
758

Para somarmos e subtrairmos duas representações binárias contendo ponto, 
basta alinharmos os pontos e aplicarmos o mesmo algoritmo de adição ou 
subtração binária demonstrada anteriormente.

Exemplos:
759

760
image::images/{cap}/figura6.eps[scaledwidth="50%"]
761

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
762
=== Fundamentos da Notação de Ponto Flutuante
763

764
(((Ponto Flutuante)))
765

766
767
768
769
770
771
772
773
774
775
776
777
A utilização da notação de ponto flutuante é muito grande em computadores, 
tanto para cálculos matemáticos com precisão, renderização de imagens 
digitais (criação de imagens pelo computador) entre outros. Os processadores 
atuais se dedicam muito em aperfeiçoar a técnica de seus chips para a 
aritmética de ponto flutuante, devido à demanda de aplicativos gráficos e 
jogos 3D que se utilizam muito deste recurso.

Nesta subseção iremos descrever os fundamentos da aritmética de ponto 
flutuante, para isso, serão apresentados alguns conceitos básicos, que 
juntamente com os conceitos da seção anterior, servirão para o entendimento 
do processo desta aritmética em um sistema computacional.

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
778
==== Notação de Excesso
779

780
(((Notação de Excesso)))
781
782
783
784
785
786
787
788
789
790
791
792
793
794

Para trabalhar com a Notação Ponto Flutuante, precisamos entender a 
representação dos números inteiros (negativos e não negativos) utilizando a 
Notação de Excesso.

Neste sistema, cada número é codificado como um padrão de bits, de 
comprimento convencionado. Para estabelecer um sistema de excesso, primeiro 
escolhemos o comprimento do padrão a ser empregado, em seguida, escrevemos 
todos os diferentes padrões de bits com este comprimento, na ordem em que eles 
seriam gerados se estivéssemos contando em binário.

Logo, observamos que o primeiro desses padrões, que representa um dígito 1 
como seu bit mais significativo, figura aproximadamente no centro da lista.

795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
[[tb_excesso_com_3_bits]]
.Notação de excesso com 3 bits.
[width="90%", frame="none", grid="all", cols="^2,^1", options="header"]
|=================================
| Valor Binário (Notação de Excesso)| Valor Representado
| 000    | -4
| 001    | -3
| 010    | -2
| 011    | -1
| 100 (centro)   | 0 
| 101    | 1 
| 110    | 2 
| 111    | 3 
|=================================


Como podemos observar na <<tb_excesso_com_3_bits>>, escolhemos este padrão para representar o 
812
813
814
815
ZERO, os padrões que o seguem serão utilizados para representar 1, 2, 3..., 
os padrões que o precedem serão adotados para a representação dos inteiros 
negativos -1, -2, -3...

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
816
Logo na <<tb_excesso_com_3_bits>> podemos observar o código resultante para padrões de três 
817
818
819
820
bits de comprimento.

Exemplo: 

821
[cols="^,^", frame="none"]
822
|==============
Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
823
| O valor 1 equivale a 101~2~ | O valor -1 equivale a 011~2~
824
825
826
827
|==============


NOTE: No sistema de Notação de Excesso é fácil distinguir entre padrões que 
828
829
830
831
representam valores negativos e positivos, pois aqueles que apresentam um 0 no 
bit mais significativo são números negativos, servindo o mesmo como bit de 
sinal.

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
832
==== Notação de Ponto Flutuante
833

834
835
836
837
838
839
840
O primeiro ponto a ser discutido, é o motivo da criação da Notação de 
Ponto Flutuante, já que na seção anterior já tínhamos trabalhado com a 
representação de números não inteiros utilizando a Notação de Ponto Fixo.

O problema do Ponto Fixo, é que o tamanho da parte inteira e da fracionária 
fica fixo com relação a seu armazenamento em memória, logo para números com 
a parte apenas inteira, a região alocada para tratar a parte fracionária 
841
será inutilizada e vice-versa. Logo, para evitar este desperdício criou-se a 
842
843
Notação de Ponto Flutuante.

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
844
845
846
847
848
////
TODO: Explicar melhor o desperdício da notação do ponto fixo em relação ao 
ponto flutuante. 
////

849
===== Ponto Flutuante
850

851
(((Ponto Flutuante)))
852
853
854
855
856
857
858
859
860

Vamos explicar a notação de ponto flutuante por meio de um exemplo que 
emprega somente um byte de memória.

Primeiramente, escolhemos o bit mais significativo do byte para ser o bit de 
sinal do número. Um ‘0’ neste bit significa que o valor representado é 
não negativo, enquanto o ‘1’ indica que é negativo.

Em seguida dividimos os sete bits restantes em dois grupos, o campo de expoente 
861
e o campo da mantissa, como mostrado na <<fig_sinal_expoente_mantissa>>.
862

863
864
[[fig_sinal_expoente_mantissa]]
.Divisão de 1 byte nos campos da Notação de Ponto Flutuante
865
image::images/{cap}/sinal_expoente_mantissa.eps[scaledwidth="60%"]
866
867


868
869
870
871
872

Seja um byte contendo o padrão de bits 01101011. Interpretando este padrão no 
formato que acabamos de definir, constatamos que o bit de sinal é ‘0’, o 
expoente é ‘110’, e a mantissa é ‘1011’.

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
873
874
875
876
877
////
TODO: Adicionar uma imagem mostrando o número 0_110_1011 dividindo em
sinal, expoente e mantissa.
////

878
Para decodificarmos o byte, extraímos primeiro a mantissa e colocamos o ponto 
879
binário à sua esquerda, obtendo:
880

881
882
883
____
`.1011`
____
884

885
886
Em seguida, extraímos o conteúdo do campo do expoente e o interpretamos como 
um inteiro codificado em três bits pelo método de representação de excesso, 
Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
887
nos dando o número positivo 2 (vide <<tb_excesso_com_3_bits>>). Isto indica que devemos 
888
deslocar o ponto binário dois bits à direita (um expoente negativo codifica um 
889
890
891
deslocamento para a esquerda do ponto binário com a adição do valor 0).

Como resultado temos:
892

893
894
895
____
10.11
____
896
897

Que representa na Notação de Ponto Fixo:
898

899
900
901
902
____
`=` 1×2^1^  + 0×2^0^  + 1×2^-1^  + 1×2^-2^
`=` 2+0+0,5+0,25 = 2,75
____
903
904

Em seguida, notamos que o bit de sinal do nosso exemplo é 0, assim, o valor 
905
representado é positivo (*+2,75*).
906

907
908
No vídeo a seguir, é possível assistir uma aula sobre a Notação de Ponto Flutuante.

909
910
911
912
913
914
915
916
917
918
919
920
921
.Vídeo sobre o Notação de Ponto Flutuante: http://youtu.be/psyH7eBVLr4
ifdef::livro-pdf[]
["qrcode", size=10, scaledwidth="30%"]
-------------------------
http://youtu.be/psyH7eBVLr4
-------------------------
endif::livro-pdf[]
ifdef::livro-html[]
+++
<?dbhtml-include href="videos/pontoFlutuante.html"?>
+++
endif::livro-html[]

922
NOTE: O uso da notação de excesso para representar o expoente no sistema de 
923
924
925
926
927
928
929
Ponto Flutuante se dá pela comparação relativa das amplitudes de dois 
valores, consistindo apenas em emparelhar as suas representações da esquerda 
para a direita em busca do primeiro bit em que os dois diferem. Assim, se ambos 
os bits de sinal forem iguais a ‘0’, o maior dos dois valores é aquele que 
apresentar, da esquerda para a direita, um ‘1’ no bit em que os padrões 
diferem, logo ao comparar:
 
930
image::images/{cap}/figura7.eps[scaledwidth="40%"]
931
932
933
934
935
936
937
938
939

Conclui-se que o primeiro padrão é maior que o segundo, sem haver a 
necessidade de decodificar as representações em Ponto Flutuante, tarefa que 
seria mais custosa.

Quando os bits de sinal forem iguais a ‘1’, o maior número é aquele que 
apresentar o ‘0’ na diferença dos padrões (sempre percorrendo o número 
da esquerda para a direita).

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
940
==== Problema com Arredondamento
941

942
(((Arredondamento)))
943

944
945
946
947
948
949
Consideremos o incômodo problema de representar o número 2,625 no sistema de 
ponto flutuante de um byte. Primeiramente, escrevemos 2,625 em binário, 
obtendo 10.101. Entretanto, ao copiarmos este código no campo da mantissa, 
não haverá espaço suficiente, e o último 1 (o qual representa a última 
parcela: 0,125) se perde, como pode ser observado na figura abaixo:

950
[cols="^"]
951
952
953
954
955
956
|==============
|2,625~10~ -> 10.101~2~
|Expoente -> 110
|Mantissa -> 10101
|==============

957
958
959

Logo temos:

960
image::images/{cap}/bit_perdido.eps[]
961

962
963
964
965
966
967
968
Ao ignorarmos este problema, e continuarmos a preencher o campo do expoente e 
do bit do sinal, teremos o padrão de bits 01101010, que representa o valor 2,5 
e não 2,625: o fenômeno assim observado é denominado erro de arredondamento, 
devido o campo da mantissa ter apenas quatro bits, enquanto, por questão de 
precisão, seriam necessários no mínimo cinco bits.

===== Overflow e Underflow
969

970
(((Overflow)))(((Underflow)))
971
972
973
974
975
976
977
978
979
980
981
982
983

Os projetistas do hardware devem encontrar um compromisso entre a mantissa e o 
expoente dos números em ponto flutuante. A relação entre mantissa e expoente 
é expressa do seguinte modo: o aumento do número de bits reservados à 
mantissa aumenta a precisão do número, enquanto o aumento do número de bits 
reservados ao expoente aumenta o intervalo de variação dos números 
representados.

Quando o expoente é muito grande ou muito pequeno para ser armazenado no 
espaço reservado para ele, ocorrem os fenômenos chamados de overflow e 
underflow respectivamente. Outro fenômeno é o próprio overflow da mantissa 
como mostrado acima.

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
984
==== Adição e Subtração em Ponto Flutuante
985

986
987
988
989
990
991
A adição e a subtração de ponto flutuante tratam os expoentes junto com o 
valor dos operandos, logo há a necessidade de equalizar os expoentes e efetuar 
a operação sobre a mantissa equalizada e o resultado deve ser normalizado 
para a representação utilizada:

Vamos analisar a seguinte adição em Ponto Flutuante:
992

993
[cols="^"]
994
|==============
Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
995
| 01101010 + 01011100 = ?
996
|==============
997
998
999

Processo:

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
1000
[cols="^1,^2"]
1001
1002
1003
1004
1005
|==============
| Mantissa 1 = 1010 | Expoente = 110 (2 na Notação de Excesso)
| Mantissa 2 = 1100 | Expoente = 101 (1 na Notação de Excesso)
|==============

1006
1007

Equalizando os expoentes, temos:
1008

1009
image::images/{cap}/figura8.eps[]
1010

1011
1012
Normalizando:

1013
[cols="^"]
1014
1015
1016
1017
|==============
| Resultado = 1000
| Expoente = 110 (2 na Notação de Excesso)
|==============
1018

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
1019
Representação do resultado (01101010 + 01011100) em Ponto Flutuante = 01101000
1020

1021
=== Lógica Binária e Portas Lógicas
1022

1023
1024
O <<apendice_logica_binaria>> contém a apresentação da *Lógica Binária* e a notação de *Portas Lógicas* (utilizadas nas confecções de circuitos).
Lá você poderá verificar como um circuito para somar 2 bits, utilizado nos computadores, pode ser implementado através de portas lógicas.
1025

1026
=== Recapitulando
1027
1028

Neste capítulo estudamos a origem dos sistemas de numeração. Aprendemos a 
1029
trabalhar com os sistemas de numeração mais utilizados na computação.
1030
Aprendemos mais profundamente o funcionamento do sistema binário, sua