De onde veio este valor? PHP, C#, SQL

Boa noite pessoas,

Um problema comum para quem trabalha com linguagens que não possuem tipos de dados bem definidos são alguns resultados inesperados que podem aparecer:

Erro 1: PHP – Soma de texto com numéricos:

Erro 2: PHP – Soma de tipos texto tendo como resultado um valor numérico:

Solução: ???

Overflow

Mas quando falamos de linguagem com tipos bem definidos, temos o problema chamado sobrecarga ou overflow (quando o tamanho máximo ou mínimo de uma variável é excedido), mas é possível enganar a engine/framework com conversões implícitas sem gerar exceções quando há algum overflow:

Erro: .NET Framework – Overflow de tipos gerando valores bizarros.

Este problema é dado pelo fato que conversões implícitas ignoram bits gerados a mais pelos cálculos, exemplo, as variáveis A e B são tipo de 2 bits com valor 2 (ou 10 binário), quando se soma A e B é gerado um binário 100 que representa o valor 4, mas como os tipos A e B somente consideram 2 bits, então o resultado em uma conversão implícita será o outro valor (0, binário 00 ou 2, binário 10).

Solução 1: Para evitar overflow, sempre utilize uma variável com overflow maior para armazenar resultados dos cálculos, exemplo: int para short e Int32 para Int16.

Solução 2: Se for necessário devolver o resultado de uma soma de Int16 para um Int16, intermedeie este cálculo com um Int32 e conversões explícitas (Convert.ToInt16 ou Int16.Parse), desta forma, se ocorrer problemas de overflow o Framework saberá alertar corretamente (desta forma também caberá ao programador um “try..catch” para tratar adequadamente o erro).

SQL Server 2008

Em T-SQL não é tão fácil enganar a engine:

Mas para algumas necessidades, somar dois tipos distintos com conversão implícita (ou seja, sem utilizar CAST ou CONVERT) também é possível:

Então, tome muito cuidado com conversões implícitas, pois se no exemplo anterior fosse desejado concatenar o valor numérico com o texto, seria necessário converter o valor inteiro para um valor texto, exemplo:

Erro: Os tipos texto em T-SQL não alertam overflow, então se você criar uma variável de 4 caracteres e tentar armazenar um texto maior, ela não armazenará mais do que os 4 caracteres, exemplo:

Solução: Para qualquer um dos “erros” apresentados, lembre-se de revisar o código questões de tamanhos e tipos de variáveis e campos, assim como será a lógica utilizada pelo computador para interpretar o que foi desenvolvido.

Espero que tenham gostado deste artigo! Este é o meu segundo post no WordPress utilizando Windows Live Writer!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s