cap3-sistema-de-numeracao.asc 36.4 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
64
65
[[sistema_egipcio]]
.Sistema de Numeração Egípcio
image::images/sistema-de-numeracao/sistema_egipicio.png[scaledwidth="70%"]

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
83
84
.Sistema de Numeração Babilônico
image::images/sistema-de-numeracao/sistema_babilonico.png[scaledwidth="70%"]

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/sistema-de-numeracao/um_babilonico.png[] = ?
91

92
image:images/sistema-de-numeracao/dez_babilonico.png[] = ?
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
119
[[sistema_romano]]
.Sistema de Numeração Romano
image::images/sistema-de-numeracao/sistema_romano.png[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
152
.Sistema de numeração Indo-Arábico
image::images/sistema-de-numeracao/sistema_arabico.png[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/sistema-de-numeracao/conversao-fazendo-divisao.png[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/sistema-de-numeracao/278_16.png[scaledwidth="50%", width="50%"]
432

433
434
Logo temos: 

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

Eduardo de Santana Medeiros Alexandre's avatar
notas    
Eduardo de Santana Medeiros Alexandre committed
439
[[sec_numeros_negativos]]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
440
=== Números Binários Negativos
441

442
(((Negativo)))
443

444
445
446
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 
447
apresentadas apenas três para representar valores negativos:
448
449
450
451
452

- sinal e amplitude/magnitude (S+M)
- complemento de 1
- complemento de 2

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

455
(((Sinal)))
456

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

Eduardo de Santana Medeiros Alexandre's avatar
base    
Eduardo de Santana Medeiros Alexandre committed
461
image::images/sistema-de-numeracao/sinal_magnitude.png[scaledwidth="40%", width="50%"]
462

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

464
==== Complemento de 1
465

466
(((Complemento de 1)))
467

468
Na representação em complemento de 1 invertem-se todos os bits de um número 
469
para representar o seu complementar: assim, se converte um valor positivo para 
470
471
472
473
474
um negativo, e vice-versa. Quando o bit mais à esquerda é 0, esse valor é 
positivo; se for 1, então é negativo.

Exemplo: 

475
476
477
____
100~10~ = 01100100~2~ (com 8 bits)
____
478
479
480
481
	

Invertendo todos os bits:

482
483
484
____
10011011~2~ = –100~10~
____
485

486

487
488
489
490
[IMPORTANT]
===============
O problema desta representação é que existem 2 padrões de bits para o 
0, havendo assim desperdício de representação:
491

492
493
494
____
0~10~ = 00000000~2~ = 11111111~2~
____
495

496
497
===============

498

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
499
==== Complemento de 2
500

501
(((Complemento de 2)))
502

503
504
A solução encontrada consiste em representar os números em *complemento de 2*. 
Para determinar o negativo de um número, inverte-se todos os seus bits e 
505
506
507
soma-se uma unidade.

Exemplo:
508

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

511
Invertendo todos os bits:: 10011010~2~
512

513
Somando uma unidade:: 10011010~2~ + 1 = 10011011~2~ = –101~10~
514

515
516

A representação em complemento para 2 tem as seguintes características:
517

518
519
520
521
- o bit da esquerda indica o sinal;
- possui processo para converter um número de positivo para negativo e de 
negativo para positivo;
- o 0 tem uma representação única: todos os bits a 0;
522
- a gama de valores que é possível representar com n bits é -2^n-1^ ... 2^n-1^-1.
523
524
525

Exemplo:

526
527
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:
528

529
530
531
____
00011011~2~
____
532
	
533
534
535

Somando uma unidade:

536
537
538
____
00011011~2~ + 1 = 00011100~2~ = 28~10~
____
539
540
541

Logo:

542
543
544
____
11100100~2~ = – 28~10~
____
545
 
546

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
547
=== Aritmética Binária
548

549
550
551
552
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.

553
[[sec_soma_binaria]]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
554
==== Soma e Subtração Binária
555

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

558
A tabuada da soma aritmética binária:
559
560

  0 + 0 = 0
561
562
563
564
  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)  
565

566
567
Por exemplo: 

568
569
570
____
Efetuar 011100~2~ + 011010~2~ 
____
571

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

574
Solução:
575

576
image::images/sistema-de-numeracao/figura1.png[scaledwidth="40%"]
577
578
579

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

580
581
582
583
 0 - 0 = 0
 0 - 1 = 1 (“vem um do próximo”)
 1 - 0 = 1
 1 - 1 = 0
584

585
NOTE: Como é impossível tirar 1 de 0, o artifício é ``pedir emprestado'' 1 
586
587
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 
588
589
ordem superior. Este algoritmo é exatamente o mesmo da subtração em decimal.

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

592
593
Solução:

594
image::images/sistema-de-numeracao/figura2.png[scaledwidth="25%"]
595

596
597
598
599
600
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.

601
602
603
604
605
606
607
608
609
610
611
612
613
614
.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[]


Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
615
==== Subtração nos computadores
616
617
618

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

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. 
624
Por exemplo, suponha que você deseja somar os números sem sinal 132~10~ e 14~10~. 
625
626


627
image::images/sistema-de-numeracao/figura3.png[scaledwidth="60%"]
628
629
630


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

635
Surge a pergunta: como a ULA sabe que os padrões de bits nas entradas 
636
637
638
639
640
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.

641
image::images/sistema-de-numeracao/figura4.png[scaledwidth="60%"]
642

643
Isto comprova um ponto muito importante. O somador na ULA sempre soma padrões 
644
645
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 
646
sendo tratados. O bom do complemento de dois é que os padrões de bits podem 
647
ser interpretados de qualquer maneira. Isto nos permite trabalhar com números 
648
649
com e sem sinal sem requerer diferentes circuitos para cada padrão.

650
651
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 
652
ser capacitada a subtrair um número de outro. Entretanto, se isto necessitar 
653
654
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, 
655
656
657
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.

658
===== Subtração em complemento de dois
659
660
661
662
663

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.

664
Como exemplo temos a subtração de 69~10~ (Minuendo) por 26~10~ (Subtraendo).
665
666

Jogue fora o transporte final:
667

668
image::images/sistema-de-numeracao/transporte-final.png[scaledwidth="100%"]
669

670
671
[NOTE]
====
672
673
674
675
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.
676
677
====

678
Este método permite à CPU realizar subtração e adição com o mesmo 
679
680
681
circuito. O método que a CPU usa para realizar subtração é de pouca 
importância para o uso de microprocessadores. 

Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
682
==== Multiplicação e divisão binária
683

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

686
Vamos ver agora a tabuada da multiplicação:
687

688
689
690
691
692
	0 x 0 = 0
	0 x 1 = 0
	1 x 0 = 0
	1 x 1 = 1

693
NOTE: O processo é idêntico à multiplicação entre números decimais.
694

695
696
697
Exemplo: 	

Efetuar: 101~2~ x 110~2~
698
699
700
701

Solução:

image::images/sistema-de-numeracao/figura5.png[scaledwidth="40%"]
702
703

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

Exemplo:
707

708
709
710
____
4 x 3 = 4 + 4 + 4 = 12
____
711

712
713
714
715
716
717

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:
718

719
720
721
____
16 ÷ 4 -> 16 *- 4* = 12 -> 12 *- 4* = 8 -> 8 *- 4* = 4 -> 4 *– 4* = 0
____
722
723


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

Eduardo de Santana Medeiros Alexandre's avatar
bits    
Eduardo de Santana Medeiros Alexandre committed
727
NOTE: Podemos concluir que qualquer operação aritmética pode ser realizada em 
728
computadores através de somas (diretas ou em complemento). Com isso 
729
730
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
731
[[sec_ponto_flutuante]]
Eduardo de Santana Medeiros Alexandre's avatar
tips    
Eduardo de Santana Medeiros Alexandre committed
732
=== Representação de Número Fracionário no Sistema Binário
733

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

736
(((Ponto Fixo)))
737

738
739
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, 
740
os dígitos à esquerda do ponto representam a parte inteira do valor, 
741
742
743
744
745
746
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:

747
748
.Representação de ponto fixo
image::images/sistema-de-numeracao/ponto-fixo.png[]
749

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

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:
757

758
image::images/sistema-de-numeracao/figura6.png[scaledwidth="50%"]
759

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

762
(((Ponto Flutuante)))
763

764
765
766
767
768
769
770
771
772
773
774
775
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
776
==== Notação de Excesso
777

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

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.

793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
[[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 
810
811
812
813
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
814
Logo na <<tb_excesso_com_3_bits>> podemos observar o código resultante para padrões de três 
815
816
817
818
bits de comprimento.

Exemplo: 

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


NOTE: No sistema de Notação de Excesso é fácil distinguir entre padrões que 
826
827
828
829
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
830
==== Notação de Ponto Flutuante
831

832
833
834
835
836
837
838
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 
839
será inutilizada e vice-versa. Logo, para evitar este desperdício criou-se a 
840
841
Notação de Ponto Flutuante.

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

847
===== Ponto Flutuante
848

849
(((Ponto Flutuante)))
850
851
852
853
854
855
856
857
858

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 
859
e o campo da mantissa, como mostrado na <<fig_sinal_expoente_mantissa>>.
860

861
862
[[fig_sinal_expoente_mantissa]]
.Divisão de 1 byte nos campos da Notação de Ponto Flutuante
863
image::images/sistema-de-numeracao/sinal_expoente_mantissa.png[scaledwidth="60%"]
864
865


866
867
868
869
870

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
871
872
873
874
875
////
TODO: Adicionar uma imagem mostrando o número 0_110_1011 dividindo em
sinal, expoente e mantissa.
////

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

879
880
881
____
`.1011`
____
882

883
884
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
885
nos dando o número positivo 2 (vide <<tb_excesso_com_3_bits>>). Isto indica que devemos 
886
deslocar o ponto binário dois bits à direita (um expoente negativo codifica um 
887
888
889
deslocamento para a esquerda do ponto binário com a adição do valor 0).

Como resultado temos:
890

891
892
893
____
10.11
____
894
895

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

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

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

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

907
908
909
910
911
912
913
914
915
916
917
918
919
.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[]

920
NOTE: O uso da notação de excesso para representar o expoente no sistema de 
921
922
923
924
925
926
927
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:
 
928
image::images/sistema-de-numeracao/figura7.png[scaledwidth="40%"]
929
930
931
932
933
934
935
936
937

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
938
==== Problema com Arredondamento
939

940
(((Arredondamento)))
941

942
943
944
945
946
947
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:

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

955
956
957

Logo temos:

958
959
image::images/sistema-de-numeracao/bit_perdido.png[]

960
961
962
963
964
965
966
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
967

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

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
982
==== Adição e Subtração em Ponto Flutuante
983

984