Ho riguardato il tuo codice, non ti funzionava anche per via del casting dei tipi. Questo funziona.
#include <EEPROM.h>
unsigned long K = 0xA0B0C0D0;
byte A;
byte B;
byte C;
byte D;
unsigned long Z;
unsigned long p;
void setup(){
delay(2000);
Serial.begin(9600);
A = (K >> 24) & 0b11111111;
B = (K >> 16) & 0b11111111;
C = (K >> 8) & 0b11111111;
D = K & 0b11111111;
Serial.println(A, HEX);
Serial.println(B, HEX);
Serial.println(C, HEX);
Serial.println(D, HEX);
EEPROM.write(1, A);
EEPROM.write(2, B);
EEPROM.write(3, C);
EEPROM.write(4, D);
Z = ((unsigned long)(A) << 24) | ((unsigned long)(B) << 16) | ((unsigned long)(C) << 8) | (unsigned long)(D);
p = ((unsigned long)(EEPROM.read(1)) << 24) | ((unsigned long)(EEPROM.read(2)) << 16) | ((unsigned long)(EEPROM.read(3)) << 8) | (unsigned long)(EEPROM.read(4));
Serial.println(Z, HEX);
Serial.println(p, HEX);
}
void loop(){
}
Te l'ho messo in esadecimale così vedi come vengono scomposte le variabili.