Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Übertrag feststellen...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.11.2008, 03:51 Uhr
Hans
Library Walker
(Operator)


Hi,

ich steh gerade etwas auf dem Schlauch...
Wie stelle ich in C fest, das an einer Integer-Wortgrenze ein Übertrag aufgetreten ist?
Beispiel:

C++:
#include <stdio.h>
#include <limits.h>

int main()
{
  unsigned int a;

  a = UINT_MAX;
  printf ("a = %u\n", a);
  a=a+1;  /* Übertrag! */
  if (übertrag) ... /* aber wie?? */

  printf ("a = %u\n", a);    

  return 0;
}

Das Programm liefert folgende Ausgabe:
Code:
a = 4294967295
a = 0

was ja soweit richtig ist. - Aber wie komme ich an den Übertrag dran???

Hans


P.S. Das hab ich schon, aber nichts Aufschlussreiches gefunden....
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 22.11.2008 um 15:05 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.11.2008, 07:14 Uhr
0xdeadbeef
Gott
(Operator)


Du verlässt dich da auf undefiniertes Verhalten, dementsprechend gibt es keine standardkonforme Antwort. In der Praxis aber,

C++:
int main() {
  unsigned a, b;

  a = UINT_MAX;
  b = a + 1;

  if(b < a) {
    // Überlauf
  }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2008, 23:03 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von 0xdeadbeef:
Du verlässt dich da auf undefiniertes Verhalten, dementsprechend gibt es keine standardkonforme Antwort.

das hab ich schon befürchtet, nachdem ich feststellen musste, das der OpenWatcom Compiler eine gewisse matherr-funktion nicht kennt, die es bei Borland gibt...


Zitat von 0xdeadbeef:
In der Praxis aber,

C++:
int main() {
  unsigned a, b;

  a = UINT_MAX;
  b = a + 1;

  if(b < a) {
    // Überlauf
  }
}



okay, das ist 'ne Möglichkeit.

In Assembler würde man ja das Carry-Flag abfragen. Aber darauf hat man von C aus ja keinen Zugriff, sofern man portabel bleiben will, bzw. keine asm-Blöcke nutzen will/kann/darf. Oder vielleicht doch, nur das ich den Trick noch nicht kenne???

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 22.11.2008 um 23:05 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2008, 23:38 Uhr
0xdeadbeef
Gott
(Operator)


100%ig portabel nicht, nein. Möglicherweise lässt sich da was mit der floating-point environment drehen (die interessanterweise auch ein paar Integer-Exceptions hat), aber das ist immer eine etwas...haarige...Angelegenheit.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: