<!-- 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>