2008-10-15 7 views
1

Dans mon application 32 bits actuelle, je vérifie (très occasionnellement) le dépassement en effectuant des opérations sur des entiers 64 bits.Comportement indéterminé en cas de dépassement de 64 bits

Cependant, sur les systèmes 64 bits, il ne semble pas y avoir d'entier de 128 bits standard. Existe-t-il un moyen simple de vérifier le débordement, ou un moyen d'obtenir des entiers de 128 bits, qui fonctionne sur tous les systèmes d'exploitation et les compilateurs?

J'ai essayé d'utiliser GMP comme une solution plus générique, mais c'est un peu lourd pour mes besoins.

L'efficacité n'est pas trop importante, pas de processeur spécifique - ASM est.

Répondre

3

Une grande partie de la discussion de cette question se pose:

How to detect integer overflow?

Un grand nombre des techniques utilisées pour débordement 32 bits chacking appliquer à 64 bits ainsi (pas toutes les techniques utilisation discuté de la prochaine type entier plus grand pour gérer le débordement).

2

this document parle de la capture des débordements (en c) en détail. Je ne sais pas s'il existe de meilleures façons de le faire en C++.

+0

En C++ j'utiliserais des modèles au lieu des macros dans ce document. Éliminer le besoin de typeof(). – Justsalt

1

Une solution consisterait à créer une classe autour de l'int de 64 bits qui remplacerait les opérateurs arithmétiques à vérifier avant d'effectuer l'opération.

Je ne me souviens pas de la syntaxe operatorX du haut de ma tête (je suis passé de C++ à Java il y a longtemps), mais un échantillon serait:

int64 myint64::add (int64 a, int64 b) { 
    if (MAX_INT64 - a > b) { 
     // error condition here. 
    } 
    return a + b; 
} 
int64 myint64::mul (int64 a, int64 b) { 
    if (MAX_INT64/a > b) { 
     // error condition here. 
    } 
    return a * b; 
} 

similaires pour toute autre opération arithmétique, bien que cela puisse devenir très compliqué pour les fonctions non-basiques telles que les puissances, les factorielles et autres. Toutefois, si vous les compilez à partir des blocs de base de l'arithmétique, ils fonctionneront.