Jump to content
Sign in to follow this  
fredericopissarra

Como é que vocês lidam com isso?

Recommended Posts

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?)...

Share this post


Link to post
Share on other sites
Posted (edited)

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
>>>

 

Edited by fredericopissarra

Share this post


Link to post
Share on other sites
15 horas atrás, fredericopissarra disse:

Acredito que tenha sido isso o que eu disse...

A minha resposta é um grosso modo!

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...