hm scheint nicht ganz das richtige zu sein.
Angenommen ich würde das z.B. für nur 6 stellen machen. Also ....783256.

Dann wäre das ja:
a = 6
a = a + (5*10)
a = a + (2*100)
a = a + (3*1000)
a = a + (8*10000)
a = a + (7*100000)

echo $a => 783256

Das wäre ja nur ne Alternative zu $a = (int) substr($val, -6);
Den String so zerschneiden geht ja, solange diese Zahl kleiner als 0x7FFFFFFF ist.
Aber: Es sind in diesen kleinen Dezimalstellen auch noch eben Werte der oberen 32bit drin.

Im Orignal-Wert (0xB31200000018) ist ja z.B. Bit 33 gesetzt (0x000200000000, 8589934592)
Wenn ich dann davon nur die letzten 6 Stellen nehme (934592) kann ich ohne Kenntnis der oberen 32bit eigentlich nichts sagen.

Nehmen wir vereinfach einfach mal den ausgelesenen Wert (0x000200000002, 8589934594).
Die unteren 32 bit sind 2, d.h. die Platte hätte 2 Stunden hinter sich.
Aber nur aus den letzten Stellen der Dezimalzahl (934594) komm ich da nie auf die tatsächliche Laufzeit.

Wenn ich nun weiss, dass 0x000200000000 = 8589934592, dann kann ich 934594 - 934592 rechnen und krieg die wirklichen 2.
Kann ich aber nicht, da 0x000200000000 > 0x7FFFFFFF.

Scheint also entweder tatsächlich nicht so ohne weiteres möglich zu sein, oder es ist so dermassen einfach, dass man's vor lauter denken nicht sieht.

MfG