{"id":1216,"date":"2021-10-07T08:41:09","date_gmt":"2021-10-07T11:41:09","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=1216"},"modified":"2021-10-07T08:41:12","modified_gmt":"2021-10-07T11:41:12","slug":"porque-cast-necessario","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/porque-cast-necessario\/","title":{"rendered":"Por que o cast \u00e9 necess\u00e1rio?"},"content":{"rendered":"\n<p><em>Casting<\/em> \u00e9 um recurso que converte um determinado valor\/vari\u00e1vel para outro tipo daquele original. Neste post eu trago uma explica\u00e7\u00e3o do porque da necessidade de fazer o <em>cast<\/em>, com foco na linguagem de programa\u00e7\u00e3o C\/C++.<\/p>\n\n\n\n<p>Uma quest\u00e3o que voc\u00ea pode ter se perguntado \u00e9 do porque da necessidade de fazer um <em>cast <\/em>que transforma 2 em 2.0, ou vice e versa, se o n\u00famero \u00e9, no final das contas, o mesmo. Para isso \u00e9 importante recordar que os valores s\u00e3o armazenados no computador na forma bin\u00e1ria e apenas com d\u00edgitos zeros e uns.<\/p>\n\n\n\n<p>Embora na matem\u00e1tica exista a representa\u00e7\u00e3o bin\u00e1ria de um valor <em>float<\/em>, o computador n\u00e3o funciona dessa maneira. Para ilustrar, considere o valor <em>25,5<\/em>. Uma representa\u00e7\u00e3o bin\u00e1ria desse valor \u00e9 a sequ\u00eancia <em>11001,1<\/em>. Essa nota\u00e7\u00e3o faz uso do separador de casas decimais, o que n\u00e3o existe na representa\u00e7\u00e3o computacional.<\/p>\n\n\n\n<p>Outra representa\u00e7\u00e3o bin\u00e1ria de valores <em>float<\/em> \u00e9 proposta pela norma <em>IEEE 754<\/em>, desenvolvida pelo Instituto de Engenheiros Eletricistas e Eletr\u00f4nicos, e utilizado como principal padr\u00e3o para opera\u00e7\u00f5es e representatividade de n\u00fameros bin\u00e1rios com ponto flutuante (<em>float<\/em>).<\/p>\n\n\n\n<p>A norma <em>IEEE 754<\/em> define dois formatos b\u00e1sicos para os n\u00fameros em ponto flutuante: o formato simples, com 32 bits e o formato duplo, com 64 bits. O formato simples \u00e9 o utilizado no tipo <em>float<\/em>, enquanto o formato duplo \u00e9 utilizado no tipo <em>double<\/em>. A sequ\u00eancia de bits do valor \u00e9 utilizada para armazenar o sinal, o expoente e a mantissa do n\u00famero.<\/p>\n\n\n\n<p>Em ambos os formatos o primeiro bit \u00e9 utilizado para determinar o sinal, cujo valor 0 representa n\u00famero positivo e o 1 representa n\u00famero negativo. No formato simples o expoente tem 8 bits e a mantissa tem 23 bits. No formato duplo, o expoente tem 11 bits e a mantissa 52 bits.<\/p>\n\n\n\n<p>O objetivo dessa se\u00e7\u00e3o n\u00e3o \u00e9 explicar como \u00e9 obtido os valores convertidos no padr\u00e3o <em>IEEE 754<\/em>, mas ilustrar a quest\u00e3o da representatividade bin\u00e1ria. O numero decimal <em>25,5<\/em>, convertido para o padr\u00e3o <em>IEEE 754<\/em> simples resulta na sequ\u00eancia bin\u00e1ria <em>01000001110011000000000000000000<\/em>. Essa mesma sequ\u00eancia bin\u00e1ria, mas utilizada para representar um n\u00famero inteiro, resulta na sequ\u00eancia bin\u00e1ria 1103888384 (utilizando o ponto como separador de milhar para melhor visualiza\u00e7\u00e3o tem-se 1.103.888.384). Observe que a mesma sequ\u00eancia bin\u00e1ria resulta em valores bastante distintos se ela for interpretada para um valor <em>float<\/em> ou para um valor <em>int<\/em>.<\/p>\n\n\n\n<p>Para outra ilustra\u00e7\u00e3o em rela\u00e7\u00e3o aos tipos de dados, considere uma vari\u00e1vel <em>int<\/em> permite armazenar valores entre -2.147.483.648 e 2.147.483.647. Se a vari\u00e1vel permitir apenas o uso de valores positivos, a vari\u00e1vel pode ser definida como <em>unsigned int<\/em> (inteira sem sinal) que consegue armazenar valores entre 0 a 4.294.967.295. Ambos s\u00e3o armazenadas em 4 bytes, mas a sequ\u00eancia bin\u00e1ria que representa o menor valor <em>int<\/em> resulta o n\u00famero -2.147.483.648, enquanto se a sequ\u00eancia representar um valor <em>unsigned int<\/em> o resultado \u00e9 o n\u00famero zero.<\/p>\n\n\n\n<p>Para mais sobre o casting, recomendo a leitura de: <a rel=\"noreferrer noopener\" href=\"http:\/\/www.galirows.com.br\/meublog\/programacao\/diferenca-arredondamento-funcao-cast\/\" target=\"_blank\">Diferen\u00e7a entre arredondamento por fun\u00e7\u00e3o e por cast<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Casting \u00e9 um recurso que converte um determinado valor\/vari\u00e1vel para outro tipo daquele original. Neste post eu trago uma explica\u00e7\u00e3o do porque da necessidade de fazer o cast, com foco na linguagem de programa\u00e7\u00e3o C\/C++. Uma quest\u00e3o que voc\u00ea pode ter se perguntado \u00e9 do porque da necessidade de fazer um cast que transforma 2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[31,66],"class_list":["post-1216","post","type-post","status-publish","format-standard","hentry","category-c","tag-casting","tag-teoria"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=1216"}],"version-history":[{"count":2,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1216\/revisions"}],"predecessor-version":[{"id":1218,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1216\/revisions\/1218"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=1216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=1216"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=1216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}