🎭 Pourquoi -123 s'affiche en "12L"?
❓ Le Problème: Affichage Bizarre
Vous déclarez:
01 MA-VARIABLE PIC S999.
MOVE -123 TO MA-VARIABLE.
DISPLAY MA-VARIABLE.
                
Vous attendez voir:

-123

Mais vous voyez:

12L

⚠️ Ce n'est pas une erreur! C'est un comportement historique du COBOL lié à la représentation interne des nombres signés. Le "L" n'est pas un caractère ordinaire - c'est une représentation du signe "-" combiné avec le dernier chiffre.
🔑 Explication: Overpunch (Surimpression)
Qu'est-ce que l'overpunch?

L'overpunch (ou "zoned decimal") est une technique historique d'économie d'espace. Au lieu de stocker le signe "-" comme un caractère séparé, le signe est fusionné dans le dernier chiffre.

Principe simple:
Avant (avec signe séparé):

- 1 2 3 = 4 caractères (1 pour le signe, 3 pour les chiffres)

Après (avec overpunch):

1 2 [3 négatif] = 3 caractères (le signe est intégré au dernier chiffre)

Économie: 1 byte sauvé par nombre!

Comment ça marche avec -123:
✅ Affichage normal
Caractère 1 - (signe)
Caractère 2 1
Caractère 3 2
Caractère 4 3
⚠️ Affichage overpunch (COBOL)
Caractère 1 1
Caractère 2 2
Caractère 3 L (3 négatif)
Total 12L = -123
✅ La clé: Vous voyez "12" en premier, puis le dernier caractère "L" qui signifie "le chiffre 3, mais négatif". Donc 12L = -123.
📊 Table d'Overpunch - Décoder les Lettres
Nombres Négatifs (les plus courants):

Quand le nombre est négatif, le dernier chiffre devient une lettre selon cette table:

Chiffre 0

} (accolade fermante)

Exemple: -120 → 12}

Chiffre 1

J

Exemple: -121 → 12J

Chiffre 2

K

Exemple: -122 → 12K

Chiffre 3

L

Exemple: -123 → 12L 👈 Notre cas!

Chiffre 4

M

Exemple: -124 → 12M

Chiffre 5

N

Exemple: -125 → 12N

Chiffre 6

O

Exemple: -126 → 12O

Chiffre 7

P

Exemple: -127 → 12P

Chiffre 8

Q

Exemple: -128 → 12Q

Chiffre 9

R

Exemple: -129 → 12R

Nombres Positifs (moins courants):

Pour les nombres positifs, vous pouvez voir des lettres A-I ou { selon votre configuration.

Chiffre 0

{ (accolade ouvrante)

Chiffre 1

A

Chiffre 2

B

Chiffres 3-9

C à I

💡 Astuce Mnémonique pour les Négatifs (J à R):

Pensez à l'ordre alphabétique:

J K L M N O P Q R
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
1 2 3 4 5 6 7 8 9

Si vous voyez un L à la fin, c'est le chiffre 3 en négatif.

📝 Exemples Pratiques - Décodez Vous-même
Exercice 1: Décoder l'affichage
Valeur COBOL Affichage (PIC S999) Signification
-100 12} 1 2 0(négatif) = -120 ✓
-121 12J 1 2 1(négatif) = -121 ✓
-122 12K 1 2 2(négatif) = -122 ✓
-123 12L 1 2 3(négatif) = -123 ✓ NOTRE CAS!
-124 12M 1 2 4(négatif) = -124 ✓
-125 12N 1 2 5(négatif) = -125 ✓
-129 12R 1 2 9(négatif) = -129 ✓
✅ Règle simple: Regardez le dernier caractère. S'il est une lettre (J-R), c'est un nombre négatif. Trouvez sa position dans l'alphabet (J=1, K=2, ..., R=9) pour découvrir le dernier chiffre.
🛠️ Solutions: Comment Obtenir un Affichage Lisible
Solution 1️⃣: Utiliser une PICTURE Éditée

Ajoutez un signe visible dans la clause PIC pour l'affichage:

❌ INCORRECT (overpunch bizarre):
01 MA-VARIABLE PIC S999.
MOVE -123 TO MA-VARIABLE.
DISPLAY MA-VARIABLE. * Affiche: 12L 😕
                    
✅ CORRECT (affichage lisible):
01 MA-VARIABLE PIC S999.
01 MA-AFFICHAGE PIC -999. * Signe visible!

MOVE -123 TO MA-VARIABLE.
MOVE MA-VARIABLE TO MA-AFFICHAGE.
DISPLAY MA-AFFICHAGE. * Affiche: -123 ✓
                    
Options de PICTURE pour l'édition:
PIC Clause Affichage de -123 Description
-999 -123 Signe "-" si négatif (le plus simple)
+999 -123 Affiche + ou -
ZZZ9- 123- Signe en fin avec suppression des zéros
Z,ZZ9 123 Avec virgule, suppression des zéros
Solution 2️⃣: Utiliser SIGN IS ... SEPARATE

Stocker le signe comme un caractère séparé (plus lent, mais très lisible):

✅ Signe séparé en début:
01 MA-VARIABLE PIC S999 SIGN IS LEADING SEPARATE. MOVE -123 TO MA-VARIABLE. DISPLAY MA-VARIABLE. * Affiche: -123 ✓
✅ Signe séparé en fin:
01 MA-VARIABLE PIC S999 SIGN IS TRAILING SEPARATE. MOVE -123 TO MA-VARIABLE. DISPLAY MA-VARIABLE. * Affiche: 123- ✓
🧪 Simulateur Interactif - Prédire l'Affichage
Entrez un nombre négatif et découvrez comment il s'affichera:
⚠️ Erreurs Courantes et Pièges
Erreur 1: Confondre avec un problème de données
❌ Mauvaise réaction:

"Mon affichage est bizarre (12L), il doit y avoir un bug!"

→ Non! C'est normal pour PIC S999. Le "L" = 3 négatif.

Erreur 2: Essayer de comparer une chaîne
❌ Code dangereux:
IF AFFICHAGE = "12L" DISPLAY "C'est -123" END-IF. * ❌ MAUVAIS!

→ La comparaison échouera si la valeur s'affiche différemment!

✅ Code correct:
01 NOMBRE-SIGNE PIC S999. IF NOMBRE-SIGNE = -123 DISPLAY "C'est -123" END-IF. * ✅ BON! Comparer les nombres
Erreur 3: Oublier que c'est du format DISPLAY
⚠️ Important: L'overpunch survient avec USAGE DISPLAY (par défaut). Avec COMP ou COMP-3, les nombres sont stockés différemment et n'affichent pas de lettres bizarres.
Erreur 4: Confondre les formats positif et négatif
❌ Confusion:

"+123" affiche comment? → Peut être "12C" (avec A-I pour positifs selon les systèmes)

→ Ne pas oublier: les positifs peuvent aussi avoir des lettres!

✅ Bonnes Pratiques
1. Toujours Éditer pour l'Affichage
* Bonne habitude: séparer calcul et affichage 01 MONTANT-CALC PIC S9(8)V99. * Calculs 01 MONTANT-AFFICH PIC -ZZZ,ZZ9.99. * Édition COMPUTE MONTANT-CALC = ... MOVE MONTANT-CALC TO MONTANT-AFFICH. DISPLAY MONTANT-AFFICH.
2. Utiliser SEPARATE pour les Données Critiques
* Si les données vont être échangées avec d'autres systèmes 01 MONTANT PIC S9(8)V99 SIGN IS LEADING SEPARATE. * Affichage lisible et pas de surprise!
3. Documenter vos Clauses PIC
01 SOLDE-COMPTE PIC S9(8)V99. * IMPORTANT: Format DISPLAY avec overpunch * Affichage naturel: 123456.78 ou "12345678" (dernier chiffre peut être une lettre) * Utiliser SOLDE-AFFICH pour affichage utilisateur 01 SOLDE-AFFICH PIC -Z,ZZZ,ZZ9.99.
4. Tester avec Nombres Négatifs

Toujours tester vos programmes avec des nombres signés pour éviter les surprises:

  • Valeur nulle (0)
  • Valeur positive simple (+5)
  • Valeur négative simple (-5)
  • Valeurs extrêmes min/max
📌 Résumé Rapide - À Retenir
Problème -123 s'affiche "12L" au lieu de "-123"
Cause Overpunch: le signe est fusionné dans le dernier chiffre
Ce que "L" signifie Le chiffre 3, mais négatif (J=1-, K=2-, L=3-, M=4-, etc.)
C'est normal? ✅ OUI! Comportement historique du COBOL avec PIC S999
Comment corriger 1. Utiliser PIC -999 (ou autre éditée) pour l'affichage
2. Utiliser SIGN IS SEPARATE
3. Calculer avec S999, afficher avec -999