Avatar billede brhino Nybegynder
31. marts 2004 - 17:22 Der er 8 kommentarer og
1 løsning

test af overflow/underflow

Hvordan kan jeg bedst tjekke for over/underflow ??

Eksempel:

unsigned int a, b;
a=0xAAAAAAAA;
b=0xBBBBBBBB;
a=a+b;

Jeg vil meget gerne kontrollere om der er over/underflow via en form for IF sætning. Altså om mit CARRY FLAG er sat !! Er det muligt, eller skal der en eller anden form for try/catch til ??
Avatar billede arne_v Ekspert
31. marts 2004 - 18:13 #1
Jeg mener desværre at integer overflow er implementation specific.

Hvis din compiler/platform smider en exception, så kan du bare fange den.

Men de fleste compilere laver bare en trunkering.

Du kunne stadig konstruere en if statement, men det ville blive
noget lidt spøjst kode.
Avatar billede brhino Nybegynder
31. marts 2004 - 18:18 #2
Jeg fandt selv en jeg kunne bruge. Den er til multiplikation, men virker så vidt jeg kan se...

    unsigned int a, b, c;

    c = a*b;
    if (b != 0 && c/b != a)
        perform_overflow_processing();
Avatar billede arne_v Ekspert
31. marts 2004 - 18:26 #3
Den virker, men:

  c=a+b;
  if(c-b != a)

virker ikke !
Avatar billede bertelbrander Novice
31. marts 2004 - 20:13 #4
Så vidt jeg lige kan se kan man bruge følgende check for overflow:

unsigned int a = 0xAABBCCDD;
unsigned int b = 0xBBBBBBBB;
unsigned int c = a + b;
if(c < a && c < b)
  printf("Overflov\n");
Avatar billede arne_v Ekspert
31. marts 2004 - 20:15 #5
Jep
Avatar billede arne_v Ekspert
31. marts 2004 - 22:17 #6
No

Jeg tror at det skal være OR ikke AND
Avatar billede bertelbrander Novice
31. marts 2004 - 22:45 #7
Hvis vi kikker på 2 bits tal:

#include <stdio.h>

int main(void)
{
  unsigned int a, b, c, carry;
  for(a = 0; a < 4; a++)
    for(b = 0; b < 4; b++)
    {
      c = (a + b) & 0x03;
      carry = c < a;
      printf("%u + %u = %u - %s\n", a, b, c, carry ? "Overflow" : "");
    }

  return 0;
}

Ser det ud til at     

carry = c < a;

giver det samme resultat som:

carry = c < b;

som giver samme resultat som:

carry = c < a && c < b;
Avatar billede arne_v Ekspert
31. marts 2004 - 23:22 #8
Logisk set må det også passe.

Summen kan aldrig blive større end nogen af tallene ved overflow.
Avatar billede arne_v Ekspert
31. marts 2004 - 23:23 #9
Jeg troede faktisk at det kunne blive større end et af dem, men det kan det
ikke. Det vil altid være mindst 1 mindre end tallene.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester