Maîtriser les Entiers Signés en COBOL
📖 Fondamentaux des Entiers Signés
Qu'est-ce qu'un entier signé?

Un entier signé en COBOL est une variable numérique capable de représenter à la fois des valeurs positives et négatives. La présence du symbole S dans la clause PIC indique que le champ peut contenir un signe.

Caractéristiques principales:
  • Lettre S: Présente dans la clause PIC pour les champs signés
  • Plage de valeurs: Négatives et positives
  • Stockage: Dépend de la clause USAGE (DISPLAY, COMP, COMP-3, etc.)
  • Représentation: Complément à deux (two's complement) pour COMP
Exemples basiques:
01 VARIABLE-SIMPLE PIC S9(5)     VALUE 0. * Entier signé, 5 chiffres
01 DECIMAL-SIGNEE PIC S9(3)V99     VALUE 0. * 3 entiers, 2 décimales
01 BINAIRE-SIGNE PIC S9(9) COMP VALUE 0. * Binaire optimisé
01 PACKED-SIGNE PIC S9(5) COMP-3 VALUE 0. * Décimal compressé
                    
Différence signé vs non-signé:
Type Clause PIC Exemple Plage (9 chiffres)
Non-signé PIC 9(9) +123456789 0 à 999,999,999
Signé PIC S9(9) -123456789 -999,999,999 à +999,999,999
🔤 Clauses PIC pour les Entiers Signés
Syntaxe générale
PIC [S]9(n)[V9(d)] [USAGE ...]
Composants:
  • S - Obligatoire pour signé, optionnel pour non-signé
  • 9(n) - Nombre de positions entières
  • V - Point décimal implicite (ne prend pas de place)
  • 9(d) - Nombre de positions décimales
  • USAGE - Type de stockage (voir ci-dessous)
Types USAGE disponibles:
1. DISPLAY (par défaut)

Stockage en format décimal édité (EBCDIC/ASCII)

01 NUM-DISPLAY PIC S9(5) USAGE DISPLAY. * Stockage: 5 bytes en texte * +12345 = {F1 F2 F3 F4 C5} (EBCDIC) * -12345 = {F1 F2 F3 F4 D5}
2. COMP-3 (COMPUTATIONAL-3)

Décimal compressé (packed decimal)

01 NUM-COMP3 PIC S9(5) COMP-3. * Stockage: 3 bytes * +12345 = {12 34 5C} * -12345 = {12 34 5D}
3. COMP ou BINARY

Binaire natif (complément à deux)

01 NUM-COMP PIC S9(5) COMP. * Stockage: 2 ou 4 bytes selon la taille * S9(1-4): 2 bytes (short, -32768 à +32767) * S9(5-9): 4 bytes (long, -2147483648 à +2147483647)
Tableaux de taille selon USAGE COMP:
Clause PIC Stockage Valeur Min Valeur Max
PIC S9(1-4) COMP 2 bytes -32,768 +32,767
PIC S9(5-9) COMP 4 bytes -2,147,483,648 +2,147,483,647
PIC S9(10-18) COMP 8 bytes -9.2×10¹⁸ +9.2×10¹⁸
🔢 Représentation Interne des Nombres Signés
Complément à Deux (Two's Complement)

En COBOL COMP, les nombres négatifs sont stockés en complément à deux. C'est la méthode standard pour les entiers binaires signés.

Exemple avec 8 bits (1 byte):
  • 0: 0000 0000
  • +1: 0000 0001
  • +127: 0111 1111 (max positif)
  • -1: 1111 1111
  • -128: 1000 0000 (min négatif)
Calcul du complément à deux:
  1. Écrire le nombre positif en binaire
  2. Inverser tous les bits (0→1, 1→0) = complément à un
  3. Ajouter 1 au résultat
Exemple: Convertir -5 (sur 8 bits):
  • +5 en binaire: 0000 0101
  • Inverser: 1111 1010
  • Ajouter 1: 1111 1011 = -5
Représentation en DISPLAY vs COMP:
Valeur DISPLAY (EBCDIC) COMP (Binaire) COMP-3 (Packed)
+123 F1F2C3 007B 123C
-123 F1F2D3 FF85 123D
⚠️ Important: Les représentations diffèrent selon USAGE. Ne pas supposer la même représentation binaire entre DISPLAY et COMP!
⚠️ Pièges Courants et Erreurs Possibles
1. Oublier le S dans la clause PIC
❌ INCORRECT:
01 MONTANT PIC 9(5). MOVE -500 TO MONTANT. * ERREUR: Impossible de stocker -500 sans S!
✅ CORRECT:
01 MONTANT PIC S9(5). MOVE -500 TO MONTANT. * OK: -500 peut être stocké
2. Débordement (Overflow)
❌ Débordement non géré:
01 NOMBRE PIC S9(3) COMP. * Max: 999 COMPUTE NOMBRE = 500 + 600. * ERREUR: 1100 > 999, débordement!
✅ Avec gestion ON SIZE ERROR:
COMPUTE NOMBRE = 500 + 600 ON SIZE ERROR DISPLAY "Débordement détecté" MOVE 999 TO NOMBRE. * Gère le débordement
3. Confusion entre DISPLAY et COMP
❌ ERREUR de représentation:

Supposer que la représentation DISPLAY = COMP

01 NUM-DISPLAY PIC S9(5) DISPLAY. * 5 bytes 01 NUM-COMP PIC S9(5) COMP. * 4 bytes * Représentations différentes!
4. Opérations avec types mixtes
⚠️ Attention aux conversions implicites:
01 NON-SIGNE PIC 9(5). * Entier positif 01 SIGNE PIC S9(5). * Peut être négatif COMPUTE NON-SIGNE = SIGNE - 1000. * Résultat négatif → stocké en non-signé!
5. Perte de précision avec les décimales
❌ Arrondi implicite:
01 PRIX PIC S9(5)V99. * 5 entiers, 2 décimales MOVE 123.456 TO PRIX. * Résultat: 123.45 (arrondi)
6. Comparaisons incorrectes
❌ ERREUR logique:
01 VALEUR PIC S9(3). IF VALEUR > 0 DISPLAY "Positif" ELSE DISPLAY "Négatif ou zéro". * N'oublie pas le zéro!
7. Calculs avec négatifs
❌ Erreur fréquente:
MULTIPLY -10 BY -5 GIVING RESULTAT. * (-10) × (-5) = +50, mais résultat attendu = +50 * Vérifier si RESULTAT est signé!
🧪 Simulateur Interactif
Convertir Nombre → Binaire (Complément à Deux)

Calculer le Débordement

Complément à Deux
✅ Bonnes Pratiques et Recommandations
1. Toujours utiliser S pour les entiers signés
* BON: Toujours expliciter le signe 01 SOLDE-COMPTE PIC S9(8)V99. 01 TEMPERATURE PIC S999. 01 DIFFERENCE PIC S9(5).
2. Dimensionner correctement les champs
* Analyser les valeurs possibles avant de coder 01 AGE PIC 999. * 0 à 999 ans 01 ANNEE PIC S9(4). * -9999 à +9999 01 SOLDE PIC S9(10)V99. * Milliards avec décimales
3. Utiliser ON SIZE ERROR systématiquement
COMPUTE RESULTAT = A + B + C ON SIZE ERROR PERFORM HANDLE-OVERFLOW-ERROR.
4. Choisir le bon USAGE
Usage Quand l'utiliser Avantage
DISPLAY Édition, rapport, I/O Lisible, simple
COMP Calculs intenses Rapide, efficace
COMP-3 Fichiers, DB Compact, standard
5. Documenter les plages de valeurs
01 MONTANT-VENTE PIC S9(8)V99. * Plage: -99,999,999.99 à +99,999,999.99 * Usage: Montants en euros * Contrôle: Vérifier débordement sur multiplication
6. Tester les valeurs limites
  • Valeur zéro
  • Valeur positive minimale (+1)
  • Valeur positive maximale
  • Valeur négative minimale (-1)
  • Valeur négative maximale
7. Éviter les pièges de conversion
* Utiliser le même type pour les opérations 01 SIGNE PIC S9(5). 01 NON-SIGNE PIC 9(5). 01 TEMP-SIGNE PIC S9(5). COMPUTE TEMP-SIGNE = SIGNE - 100. MOVE TEMP-SIGNE TO NON-SIGNE. * Conversion explicite et contrôlée