OK, this isn't going to be the prettiest chunk of data to look at but it will do.
This is part of a typical MKIV VDO cluster eeprom dump
Address in hex, hex data, ascii data
You can see the vehicle VIN and Immobilizer ID(both changed from real in this example)
In green is the immobilizer SKC/PIN, its value is stored three times, take the first pair of bytes and swap them, so 2D0E becomes 0E2D, then convert to decimal - 03629 is the SKC in this dump.
In red is the odometer mileage record. It is also two bytes in length but is stored eight times. The mileage record in this dump is 60D2. To get the mileage that would be displayed on the odometer we first swap the two bytes, so 60D2 becomes D260. We then subtract that value from FFFF.
So FFFF - D260 = 2D9F. Now convert 2D9F to decimal which is 11679, now multiply that number by 10 and we have 116790 which is what the odometer would show in miles. The last digit of the odometer is not stored in the same way and is represented by a different byte, that value I do not know. When you program mileage into a new cluster you don't enter it and generally enter 10% of the mileage you really want. If the odometer is configured to metric it simply multiplies the result by roughly 1.6.
So the stored value in a odometer with 0 miles would be FFFF and it decrements from there.
Its fun having a spare cluster to see how things all work...
00A0 | FFFF56575A375A304134343333313333 |..VWZ7Z0A4433133
00B0 | 56575A375A3041343433333133335657 |VWZ7Z0A4433133VW
00C0 | 5A375A3041343433333333322D0E2D0E |Z7Z0A4433332-.-.
00D0 | 2D0E394257444536314A323234343438 |-.9BWDE61J224448
00E0 | 303538FF585858585858585858585858 |058.XXXXXXXXXXXX
00F0 | 5858585858BCDC90FC8931D860D260D2 |XXXXX.....1.`.`.
0100 | 60D260D260D260D260D260D200000000 |`.`.`.`.`.`.....
0110 | 000000001000000000000000314A3039 |............1J09
0120 | 32303930364A20204134563037FF0C00 |20906J A4V07...
0130 | 0000364E3039303939303120192A1101 |..6N0909901 .*..