fredericopissarra Postado Março 30, 2019 em 14:31 Compartilhar Postado Março 30, 2019 em 14:31 Exceto linguagens como Python, onde os tipos integrais são "big numbers", ou seja, não estão restritos a uma quantidade delimitada de bits, em linguagens como C, C++, ... que têm tipos definidos, como é que vocês fazem para detectar overflows em operações aritméticas? Notaram que não há como acessar os flags da status word do processador, diretamente, nessas linguagens? Ou será que nunca pensaram nisso? Por exemplo, numa expressão: x += y; Se x for do tipo int, como saber se ele extrapolou o limite superior? (se int tem 32 bits, o limite superior é, obviamente, +2³¹-1. Ao incrementar ele passa a ser -2³¹... Pode-se verificar o sinal, mas temos que ter um método mais "genérico" porque y pode ser negativo também... se x for -2³¹ e y for -1, também teremos um overflow... Existe o método simples e um mais genérico... Que não vou mostrar aqui no interesse de causar uma discussão (um Forum serve pra isso, não?)... Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Março 30, 2019 em 14:34 Autor Compartilhar Postado Março 30, 2019 em 14:34 Com relação a minha alegação sobre Python: $ python Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> x=2**31-1 >>> x 2147483647 >>> x+1 2147483648 >>> x=2**64-1 >>> x 18446744073709551615 >>> x+1 18446744073709551616L >>> x=2**128-1 >>> x 340282366920938463463374607431768211455L >>> x+1 340282366920938463463374607431768211456L >>> Link para o comentário Compartilhar em outros sites More sharing options...
kassane Postado Março 30, 2019 em 19:44 Compartilhar Postado Março 30, 2019 em 19:44 Se não me engano o Python usa Aritmética de Precisão Arbitrária, ou seja, os tipos de dados não têm limite além daquele usado na memória da sua máquina (que é bem grande para um valor inteiro). Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Março 30, 2019 em 21:14 Autor Compartilhar Postado Março 30, 2019 em 21:14 1 hora atrás, kassane disse: Se não me engano o Python usa Aritmética de Precisão Arbitrária, ou seja, os tipos de dados não têm limite além daquele usado na memória da sua máquina (que é bem grande para um valor inteiro). Acredito que tenha sido isso o que eu disse... Link para o comentário Compartilhar em outros sites More sharing options...
kassane Postado Março 31, 2019 em 13:13 Compartilhar Postado Março 31, 2019 em 13:13 15 horas atrás, fredericopissarra disse: Acredito que tenha sido isso o que eu disse... A minha resposta é um grosso modo! Link para o comentário Compartilhar em outros sites More sharing options...
fredericopissarra Postado Março 31, 2019 em 13:27 Autor Compartilhar Postado Março 31, 2019 em 13:27 Um de meus artiguinhos com mais detalhes... e um jeito melhor: https://bitismyth.wordpress.com/2019/03/31/adicoes-e-subtracoes-inteiras-condicoes-de-overflow/ Multiplicações são mais "simples" e divisões não causam overflows... Link para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Abril 24, 2019 em 07:39 Compartilhar Postado Abril 24, 2019 em 07:39 Eu tentei fazer algo com INT_MAX mas não consegui. Achei animais suas funções pra detecção de overflow: int ofadd( int s, int a, int b ) { return b >= 0 ? s < a : s > a; } int ofadd2( int s, int a, int b ) { return ( ~(a ^ b) & (s ^ a) ) >> (8 * sizeof a - 1); } Valeu por mais essa! Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Arquivado
Este tópico foi arquivado e está fechado para novas respostas.