<!--
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 =&gt; rS-S = r^(n+1)-r^0 &gt; 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/>&nbsp;<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>