01 MA-VARIABLE PIC S999. MOVE -123 TO MA-VARIABLE. DISPLAY MA-VARIABLE.
-123
12L
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.
- 1 2 3 = 4 caractères (1 pour le signe, 3 pour les chiffres)
1 2 [3 négatif] = 3 caractères (le signe est intégré au dernier chiffre)
Économie: 1 byte sauvé par nombre!
| Caractère 1 | - (signe) |
| Caractère 2 | 1 |
| Caractère 3 | 2 |
| Caractère 4 | 3 |
| Caractère 1 | 1 |
| Caractère 2 | 2 |
| Caractère 3 | L (3 négatif) |
| Total | 12L = -123 |
Quand le nombre est négatif, le dernier chiffre devient une lettre selon cette table:
} (accolade fermante)
Exemple: -120 → 12}
J
Exemple: -121 → 12J
K
Exemple: -122 → 12K
L
Exemple: -123 → 12L 👈 Notre cas!
M
Exemple: -124 → 12M
N
Exemple: -125 → 12N
O
Exemple: -126 → 12O
P
Exemple: -127 → 12P
Q
Exemple: -128 → 12Q
R
Exemple: -129 → 12R
Pour les nombres positifs, vous pouvez voir des lettres A-I ou { selon votre configuration.
{ (accolade ouvrante)
A
B
C à I
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.
| 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 ✓ |
Ajoutez un signe visible dans la clause PIC pour l'affichage:
01 MA-VARIABLE PIC S999. MOVE -123 TO MA-VARIABLE. DISPLAY MA-VARIABLE. * Affiche: 12L 😕
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 ✓
| 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 |
Stocker le signe comme un caractère séparé (plus lent, mais très lisible):
"Mon affichage est bizarre (12L), il doit y avoir un bug!"
→ Non! C'est normal pour PIC S999. Le "L" = 3 négatif.
→ La comparaison échouera si la valeur s'affiche différemment!
"+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!
Toujours tester vos programmes avec des nombres signés pour éviter les surprises:
| 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 |