123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <!--
- Introdução aos números inteiros
- -->
- <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
- <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
- <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
- <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
- <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
- <div class="pagina">
- <p class="secao">Introdução aos números inteiros</p>
- <!--
- <p>
- <b>Alterações</b>: //2017 <i>C</i> e <i>Python</i>)
- </p>
- -->
- <p>
- Nesta seção examinaremos a representação de <i>números inteiros</i> no computador.
- </p>
- <a name="bytes"><span style="color: #0050A0">Sequência de <i>bits</i> (e <i>bytes</i>) para representar um inteiro</span></a>
- <p>
- Toda informação no computador digital é composta por <i>bits</i>, em
- particular todo símbolo ou <b>caractere</b> é representado por um número fixo de <i>bits</i>,
- sendo que geralmente usa-se uma quantidade fixa de <i>bits</i> para
- representar qualquer caractere, por exemplo, a sequência binária <tt>1000001</tt>
- equivale ao caractere <tt>A</tt> ('a' maiúsculo).
- Mas o binário <tt>1000001</tt> é correspondente ao número decimal
- <!-- <i>2^6+2^0 = 64+1 = 65</i> -->
- <i>2<sup>6</sup>+2<sup>0</sup> = 64+1 = 65</i>,
- assim o caractere <tt>A</tt> está associado ao número
- <tt>65</tt>
- (<a href="#" onclick="trocaPagina('introducao_caracteres.html')" title="examinar o conceito de caracteres">vide explicação sobre código ASCII</a>).
- </p>
- <!--
- 1000001 => 1 2^6 + 0 2^5 + 0 2^4 + 0 2^3 + 0 2^2 + 0 2^1 + 1 2^0 = 2^6 + 1 = 64 + 1 = 65
- -->
- <a name="umbyte"><span style="color: #0050A0">Quantos inteiros conseguimos com 8 <i>bits</i></span></a>
- <p>
- Assim, o número de <i>bits</i> utilizados para representar os inteiros define o intervalo de inteiro que podemos conseguir.
- Por exemplo, se dispomos de 8 <i>bits</i>, que é denominado um <b>bytes</b>, podemos conseguir até <i>2<sup>8</sup></i>
- diferentes valores, pois podemos usar desde <tt>00000000</tt> até o binário <tt>11111111</tt>.
- </p>
- <p>
- Portanto, se o computador tivesse apenas 8 <i>bits</i> para representar inteiros positivos, poderíamos ter
- desde o <tt>00000000</tt> (correspondendo ao decimal <i>0</i>) até o binário <tt>11111111</tt>,
- que correspondente ao decimal
- <i title="Lembrando: S=r^0+r^1+...+r^n => rS-S = r^(n+1)-r^0 > S = r^(n+1)-1 / (r-1) "
- >2<sup>0</sup> + 2<sup>1</sup> + 2<sup>2</sup> + 2<sup>3</sup> + 2<sup>4</sup> + 2<sup>5</sup> + 2<sup>6</sup> +
- 2<sup>7</sup> = 1+2+4+8+16+32+64+128 = 256-1 = 255</i>.
- <!-- >2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + 2^7 = 1+2+4+8+16+32+64+128 = 256-1 = 255 -->
- </p>
- <div class="ladoalado">
- <div id="ladoesquerdo">
- <p>
- Mas se precisarmos dos inteiros negativos, poderíamos usar o primeiro <i>bit</i> para o sinal
- (<i>1</i> indicando negativo) ou fazer o complemento binário ("invertendo" os <i>bits</i>).
- No primeiro caso, com os mesmos <i>8</i> <i>bits</i>, poderíamos ir desde <tt>-127</tt>
- (<i>-2<sup>6</sup>-2<sup>5</sup>-...-2<sup>1</sup>-2<sup>0</sup></i>) até
- <tt>127</tt>, mas perderíamos uma entrada (tanto <tt>10000000</tt>, quanto <tt>00000000</tt> poderiam ser associadas ao <i>0</i>).
- Essa associação, que não é utilizada na prática, está ilustrada na terceira coluna da tabela ao lado.
- </p>
- <p>
- A outra opção, denominada <b>complemento de dois</b>, podemos variar de <tt>-128</tt> até <tt>127</tt>, como indicado na segunda
- coluna da tabela ao lado.
- Nessa representação para obter o negativo de um número deve-se aplicar dois passos:
- <ol>
- <li> Inverter os <i>bits</i> do número e depois somar um.<br/>
- <i>Exemplo 1.</i> Para o <i>127</i> cujo binário é <tt>01111111</tt>:
- inverte <tt>10000000</tt> e soma-se um, resultando <tt>10000001</tt> (<i>-127</i>).</br>
- <i>Exemplo 2.</i> Para o <i>126</i> cujo binário é <tt>01111110</tt>:
- inverte <tt>10000001</tt> e soma-se um, resultando <tt>10000010</tt> (<i>-126</i>).</br>
- <i>Exemplo 3.</i> Para o <i>1</i> cujo binário é <tt>00000001</tt>:
- inverte <tt>11111110</tt> e soma-se um, resultando <tt>11111111</tt> (<i>-1</i>).</li>
- </ol>
- Assim, nessa representação existe um negativo a mais, no caso o <i>-128</i>, que é <tt>10000000</tt>, pois
- ao somar <tt>10000000</tt> com <tt>01111111</tt> (que é o decimal <i>127</i>) obtém-se <tt>11111111</tt> que
- é o decimal <i>-1</i> (exemplo 3), ou seja,
- <i>-128 + 127 = -1</i>.
- <center>
- <table>
- <tr><td><tt>01111111</tt></td></tr>
- <tr><td align="right"><tt> +</tt></td></tr>
- <tr><td><tt>10000000</tt></td></tr>
- <tr><td><tt>--------</tt></td></tr>
- <tr><td><tt>11111111</tt></td></tr>
- </table>
- </center>
- </div>
- <p>
- <p>
- Na tabela 1 apresentamos os binários entre <i>00000000</i> e <i>11111111</i>, mostrando seu correspondente decimal usando
- a técnica de <i>complemento de dois</i> (coluna do meio) e a conversão usual para decimal (coluna da direita).
- Na conversão matemática usual, deve-se usar o valor do <i>bit</i> (<i>digito</i>) multiplicado por sua potência.
- Por exemplo, o primeiro binário <i>00000000</i> é <i>0</i>, pois é <i>0 x 2<sup>k</sup> para todo natural <i>k</i>, por outro
- lado o binário <i>00010011</i> é <i>19</i>, pois é <i>1 x 2<sup>4</sup> + 1 x 2<sup>1</sup> + 1 x 2<sup>0</sup> = 16 + 2 + 1 = 19</i>.
- </p>
- <div id="ladodireito">
- <center>
- <i>Tab. 1. Exemplo de números binários e seu correspondente decimal usando <i>complemento de dois</i> e decimal usual</i>
- <br/>
- <table class="tbCodeLinCol trB">
- <tr><th>Número binário</th>
- <th>decimal com sinal (complemento)</th>
- <th>decimal sem sinal</th>
- </tr>
- <tr><td><tt>00000000</tt></td><td><tt> 0</tt></td> <td><tt> 0</tt></td></tr>
- <td><tt>00000001</tt></td><td><tt> 1</tt></td> <td><tt> 1</tt></td></tr>
- <td><tt>00000010</tt></td><td><tt> 2</tt></td> <td><tt> 2</tt></td></tr>
- <td><tt>00000011</tt></td><td><tt> 3</tt></td> <td><tt> 3</tt></td></tr>
- <td><tt>00000100</tt></td><td><tt> 4</tt></td> <td><tt> 4</tt></td></tr>
- <td><tt>00000101</tt></td><td><tt> 5</tt></td> <td><tt> 5</tt></td></tr>
- <td><tt>...</tt></td><td><tt>...</tt></td> <td><tt> ...</tt></td></tr>
- <td><tt>01111110</tt></td><td><tt> 126</tt></td> <td><tt> 126</tt></td></tr>
- <td><tt>01111111</tt></td><td><tt> 127</tt></td> <td><tt> 127</tt></td></tr>
- <td><tt>10000000</tt></td><td><tt>-128</tt></td> <td><tt> 128</tt></td></tr>
- <td><tt>10000001</tt></td><td><tt>-127</tt></td> <td><tt> 129</tt></td></tr>
- <td><tt>10000010</tt></td><td><tt>-126</tt></td> <td><tt> 130</tt></td></tr>
- <td><tt>10000011</tt></td><td><tt>-125</tt></td> <td><tt> 131</tt></td></tr>
- <td><tt>...</tt></td><td><tt>...</tt></td> <td><tt> ...</tt></td></tr>
- <td><tt>11111101</tt></td><td><tt> -3</tt></td> <td><tt> 253</tt></td></tr>
- <td><tt>11111110</tt></td><td><tt> -2</tt></td> <td><tt> 254</tt></td></tr>
- <td><tt>11111111</tt></td><td><tt> -1</tt></td> <td><tt> 255</tt></td></tr>
- </table>
- </center>
- </div>
- <br/> <br/>
- <a name="doisbytes"><span style="color: #0050A0">Inteiros com dois <i>bytes</i> (ou 16 <i>bits</i>)</span></a>
- <!--
- -32 768 a +32 767
- -->
- <p>
- Claramente <i>8</i> <i>bits</i> (que equivale a um <i><b>byte</b></i>) resulta em um intervalo para trabalho bastante limitado.
- Se dobrarmos o número de <i>bits</i>, passando a usar <i>16</i> <i>bits</i>, ou dois <i>bytes</i>,
- melhoramos bastante o intervalo de inteiros que podemos usar.
- Nesse caso, o número de possibilidades distintas é de <i>2<sup>16</sup>=65536</i>, o que
- possibilita os inteiros sem sinal desde o <tt>0</tt> até o <tt>65535</tt>.
- </p>
- <p>
- Considerando inteiros negativos, usando a representação com <i>complemento de dois</i>, conseguimos representar
- desde o <i>-32768</i> até o <i>32767</i>.
- <!--
- https://en.wikipedia.org/wiki/Signed_number_representations
- -->
- </p>
- <p class="autoria">
- <a href="https://www.ime.usp.br/~leo" target="_blank" title="seguir para a pagina do prof. Leônidas">Leônidas de Oliveira Brandão</a><br/>
- <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
- </p>
- <p class="rodape">
- <b>Alterações</b>:<br/>
- 2020/08/15: novo formato, pequenas revisões<br/>
- </p>
- </div>
|