introducao_inteiros.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <!--
  2. Introdução aos números inteiros
  3. -->
  4. <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
  5. <meta name='keywords' content='mac0122, material, professores, leonidas de oliveira brandao'>
  6. <link rel='stylesheet' type='text/css' href='css_img_js_conf/all.css'>
  7. <link rel='stylesheet' type='text/css' href='css_img_js_conf/line_introducao_programacao.css'>
  8. <script src="css_img_js_conf/defineLInE.js"></script> <!-- para referencias 'a documentos internos -->
  9. <div class="pagina">
  10. <p class="secao">Introdução aos números inteiros</p>
  11. <!--
  12. <p>
  13. <b>Alterações</b>: //2017 <i>C</i> e <i>Python</i>)
  14. </p>
  15. -->
  16. <p>
  17. Nesta seção examinaremos a representação de <i>números inteiros</i> no computador.
  18. </p>
  19. <a name="bytes"><span style="color: #0050A0">Sequência de <i>bits</i> (e <i>bytes</i>) para representar um inteiro</span></a>
  20. <p>
  21. Toda informação no computador digital é composta por <i>bits</i>, em
  22. particular todo símbolo ou <b>caractere</b> é representado por um número fixo de <i>bits</i>,
  23. sendo que geralmente usa-se uma quantidade fixa de <i>bits</i> para
  24. representar qualquer caractere, por exemplo, a sequência binária <tt>1000001</tt>
  25. equivale ao caractere <tt>A</tt> ('a' maiúsculo).
  26. Mas o binário <tt>1000001</tt> é correspondente ao número decimal
  27. <!-- <i>2^6+2^0 = 64+1 = 65</i> -->
  28. <i>2<sup>6</sup>+2<sup>0</sup> = 64+1 = 65</i>,
  29. assim o caractere <tt>A</tt> está associado ao número
  30. <tt>65</tt>
  31. (<a href="#" onclick="trocaPagina('introducao_caracteres.html')" title="examinar o conceito de caracteres">vide explicação sobre código ASCII</a>).
  32. </p>
  33. <!--
  34. 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
  35. -->
  36. <a name="umbyte"><span style="color: #0050A0">Quantos inteiros conseguimos com 8 <i>bits</i></span></a>
  37. <p>
  38. Assim, o número de <i>bits</i> utilizados para representar os inteiros define o intervalo de inteiro que podemos conseguir.
  39. Por exemplo, se dispomos de 8 <i>bits</i>, que é denominado um <b>bytes</b>, podemos conseguir até <i>2<sup>8</sup></i>
  40. diferentes valores, pois podemos usar desde <tt>00000000</tt> até o binário <tt>11111111</tt>.
  41. </p>
  42. <p>
  43. Portanto, se o computador tivesse apenas 8 <i>bits</i> para representar inteiros positivos, poderíamos ter
  44. desde o <tt>00000000</tt> (correspondendo ao decimal <i>0</i>) até o binário <tt>11111111</tt>,
  45. que correspondente ao decimal
  46. <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) "
  47. >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> +
  48. 2<sup>7</sup> = 1+2+4+8+16+32+64+128 = 256-1 = 255</i>.
  49. <!-- >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 -->
  50. </p>
  51. <div class="ladoalado">
  52. <div id="ladoesquerdo">
  53. <p>
  54. Mas se precisarmos dos inteiros negativos, poderíamos usar o primeiro <i>bit</i> para o sinal
  55. (<i>1</i> indicando negativo) ou fazer o complemento binário ("invertendo" os <i>bits</i>).
  56. No primeiro caso, com os mesmos <i>8</i> <i>bits</i>, poderíamos ir desde <tt>-127</tt>
  57. (<i>-2<sup>6</sup>-2<sup>5</sup>-...-2<sup>1</sup>-2<sup>0</sup></i>) até
  58. <tt>127</tt>, mas perderíamos uma entrada (tanto <tt>10000000</tt>, quanto <tt>00000000</tt> poderiam ser associadas ao <i>0</i>).
  59. Essa associação, que não é utilizada na prática, está ilustrada na terceira coluna da tabela ao lado.
  60. </p>
  61. <p>
  62. A outra opção, denominada <b>complemento de dois</b>, podemos variar de <tt>-128</tt> até <tt>127</tt>, como indicado na segunda
  63. coluna da tabela ao lado.
  64. Nessa representação para obter o negativo de um número deve-se aplicar dois passos:
  65. <ol>
  66. <li> Inverter os <i>bits</i> do número e depois somar um.<br/>
  67. <i>Exemplo 1.</i> Para o <i>127</i> cujo binário é <tt>01111111</tt>:
  68. inverte <tt>10000000</tt> e soma-se um, resultando <tt>10000001</tt> (<i>-127</i>).</br>
  69. <i>Exemplo 2.</i> Para o <i>126</i> cujo binário é <tt>01111110</tt>:
  70. inverte <tt>10000001</tt> e soma-se um, resultando <tt>10000010</tt> (<i>-126</i>).</br>
  71. <i>Exemplo 3.</i> Para o <i>1</i> cujo binário é <tt>00000001</tt>:
  72. inverte <tt>11111110</tt> e soma-se um, resultando <tt>11111111</tt> (<i>-1</i>).</li>
  73. </ol>
  74. Assim, nessa representação existe um negativo a mais, no caso o <i>-128</i>, que é <tt>10000000</tt>, pois
  75. ao somar <tt>10000000</tt> com <tt>01111111</tt> (que é o decimal <i>127</i>) obtém-se <tt>11111111</tt> que
  76. é o decimal <i>-1</i> (exemplo 3), ou seja,
  77. <i>-128 + 127 = -1</i>.
  78. <center>
  79. <table>
  80. <tr><td><tt>01111111</tt></td></tr>
  81. <tr><td align="right"><tt> +</tt></td></tr>
  82. <tr><td><tt>10000000</tt></td></tr>
  83. <tr><td><tt>--------</tt></td></tr>
  84. <tr><td><tt>11111111</tt></td></tr>
  85. </table>
  86. </center>
  87. </div>
  88. <p>
  89. <p>
  90. Na tabela 1 apresentamos os binários entre <i>00000000</i> e <i>11111111</i>, mostrando seu correspondente decimal usando
  91. a técnica de <i>complemento de dois</i> (coluna do meio) e a conversão usual para decimal (coluna da direita).
  92. Na conversão matemática usual, deve-se usar o valor do <i>bit</i> (<i>digito</i>) multiplicado por sua potência.
  93. 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
  94. 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>.
  95. </p>
  96. <div id="ladodireito">
  97. <center>
  98. <i>Tab. 1. Exemplo de números binários e seu correspondente decimal usando <i>complemento de dois</i> e decimal usual</i>
  99. <br/>
  100. <table class="tbCodeLinCol trB">
  101. <tr><th>Número binário</th>
  102. <th>decimal com sinal (complemento)</th>
  103. <th>decimal sem sinal</th>
  104. </tr>
  105. <tr><td><tt>00000000</tt></td><td><tt> 0</tt></td> <td><tt> 0</tt></td></tr>
  106. <td><tt>00000001</tt></td><td><tt> 1</tt></td> <td><tt> 1</tt></td></tr>
  107. <td><tt>00000010</tt></td><td><tt> 2</tt></td> <td><tt> 2</tt></td></tr>
  108. <td><tt>00000011</tt></td><td><tt> 3</tt></td> <td><tt> 3</tt></td></tr>
  109. <td><tt>00000100</tt></td><td><tt> 4</tt></td> <td><tt> 4</tt></td></tr>
  110. <td><tt>00000101</tt></td><td><tt> 5</tt></td> <td><tt> 5</tt></td></tr>
  111. <td><tt>...</tt></td><td><tt>...</tt></td> <td><tt> ...</tt></td></tr>
  112. <td><tt>01111110</tt></td><td><tt> 126</tt></td> <td><tt> 126</tt></td></tr>
  113. <td><tt>01111111</tt></td><td><tt> 127</tt></td> <td><tt> 127</tt></td></tr>
  114. <td><tt>10000000</tt></td><td><tt>-128</tt></td> <td><tt> 128</tt></td></tr>
  115. <td><tt>10000001</tt></td><td><tt>-127</tt></td> <td><tt> 129</tt></td></tr>
  116. <td><tt>10000010</tt></td><td><tt>-126</tt></td> <td><tt> 130</tt></td></tr>
  117. <td><tt>10000011</tt></td><td><tt>-125</tt></td> <td><tt> 131</tt></td></tr>
  118. <td><tt>...</tt></td><td><tt>...</tt></td> <td><tt> ...</tt></td></tr>
  119. <td><tt>11111101</tt></td><td><tt> -3</tt></td> <td><tt> 253</tt></td></tr>
  120. <td><tt>11111110</tt></td><td><tt> -2</tt></td> <td><tt> 254</tt></td></tr>
  121. <td><tt>11111111</tt></td><td><tt> -1</tt></td> <td><tt> 255</tt></td></tr>
  122. </table>
  123. </center>
  124. </div>
  125. <br/>&nbsp;<br/>
  126. <a name="doisbytes"><span style="color: #0050A0">Inteiros com dois <i>bytes</i> (ou 16 <i>bits</i>)</span></a>
  127. <!--
  128. -32 768 a +32 767
  129. -->
  130. <p>
  131. Claramente <i>8</i> <i>bits</i> (que equivale a um <i><b>byte</b></i>) resulta em um intervalo para trabalho bastante limitado.
  132. Se dobrarmos o número de <i>bits</i>, passando a usar <i>16</i> <i>bits</i>, ou dois <i>bytes</i>,
  133. melhoramos bastante o intervalo de inteiros que podemos usar.
  134. Nesse caso, o número de possibilidades distintas é de <i>2<sup>16</sup>=65536</i>, o que
  135. possibilita os inteiros sem sinal desde o <tt>0</tt> até o <tt>65535</tt>.
  136. </p>
  137. <p>
  138. Considerando inteiros negativos, usando a representação com <i>complemento de dois</i>, conseguimos representar
  139. desde o <i>-32768</i> até o <i>32767</i>.
  140. <!--
  141. https://en.wikipedia.org/wiki/Signed_number_representations
  142. -->
  143. </p>
  144. <p class="autoria">
  145. <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/>
  146. <a href="http://www.ime.usp.br/~leo" target="_blank" title="seguir para a página do LInE">http://line.ime.usp.br</a>
  147. </p>
  148. <p class="rodape">
  149. <b>Alterações</b>:<br/>
  150. 2020/08/15: novo formato, pequenas revisões<br/>
  151. </p>
  152. </div>