# Comp3 Packed Decimal

Reference for COBOL COMP-3 (packed decimal / BCD) numeric storage -- layout on disk...

- Repository: https://github.com/benchflow-ai/skillsbench (1888 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-10-24
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add benchflow-ai/skillsbench --skill comp3-packed-decimal -g -a claude-code -y`
Codex: `npx skills add benchflow-ai/skillsbench --skill comp3-packed-decimal -g -a codex -y`
Cursor: `npx skills add benchflow-ai/skillsbench --skill comp3-packed-decimal -g -a cursor -y`
Gemini CLI: `npx skills add benchflow-ai/skillsbench --skill comp3-packed-decimal -g -a gemini-cli -y`

## Description

Reference for COBOL COMP-3 (packed decimal / BCD) numeric storage -- layout on disk, declaring it in the FD, and pitfalls when carrying the decoded value through working storage and into later arithmetic. Useful when an input record holds a balance, rate, or carry-forward as packed decimal rather than a printable digit string.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# COMP-3 / packed decimal storage

`USAGE COMP-3` (a.k.a. PACKED-DECIMAL) stores a signed numeric field as
binary-coded-decimal nibbles: each byte holds two decimal digits, except the
last byte whose low nibble is the sign:

```
PIC S9(11)V99 USAGE COMP-3
+--+--+--+--+--+--+--+
|D1|D2|D3|D4|D5|D6|D7|   7 bytes total for 13 digits
+--+--+--+--+--+--+--+
              ^^-- sign nibble in the LOW half of the last byte
```

Bytes-on-disk = `ceil((digit_count + 1) / 2)`. For `PIC S9(11)V99` that is
`ceil(14 / 2) = 7` bytes. The high nibble of the first byte holds the first
decimal digit; the implied decimal point is not stored.

Sign nibbles:

| Nibble | Meaning |
|--------|---------|
| `C`    | positive (some shops emit `F` for unsigned, but `C` is standard for SIGNED) |
| `D`    | negative |
| `F`    | unsigned / non-`S` PIC |

## Declaring COMP-3 in an FD

The record layout must match the byte budget. If the data in the file is
packed but you declare the field as `PIC X(n)` or as an unpacked decimal,
the COBOL runtime will not decode it and the value will look like binary
garbage when displayed.

```cobol
FD  MAST-FILE
    RECORD CONTAINS 80 CHARACTERS.
01  MAST-REC.
    05  M-ACCT     PIC X(6).
    05  M-TYPE     PIC X.
    05  M-STATUS   PIC X.
    05  M-CCY      PIC X(3).
    05  M-CARRY    PIC S9(11)V99 USAGE COMP-3.   *> 7 bytes
    05  FILLER     PIC X(62).                    *> remainder of 80
```

Use a runtime check: `cobc -x -free -o prog PROG.cbl && ./prog` and DISPLAY
one record's COMP-3 field before relying on it. Common mistakes:

- Forgetting the `USAGE COMP-3` clause -> the field is read as 7 zoned
  ASCII characters; values look like control characters.
- Wrong digit count -> the byte budget changes and subsequent fields slide.
- Moving COMP-3 directly into a `PIC X(7)` workspace -> the bytes copy but
  no arithmetic translation happens; the value is unusable.

## Carrying the value through working storage

The rest: https://github.com/benchflow-ai/skillsbench/blob/HEAD/tasks-extra/cobol-gl-batch-reconcile/environment/skills/comp3-packed-decimal/SKILL.md
