Devi saltare la lettura dell'ultimo dato perché non fa parte del numero, ma indica solo il segno.
quindi per il primo pacchetto
for(x=24; x<47; x++) { reading1=reading1+(data[x]*pow(2,x-24));
e per il secondo:
for(x=0; x<23; x++) { reading2=reading2+(data[x]*pow(2,x));
Poi con un if moltiplichi il numero -1 in base al valore dell'ultimo bit.
if (data[47]==1) reading1 = reading1 * -1;
e
if (data[23]==1) reading2 = reading2 * -1;
Controlla il codice perché non ho verificato se è corretto e compila, ma la logica dovrebbe andare.
Forse puoi fare anche un
if (data[47]==1) reading1 != reading1;
EDIT:
Verifica gli indici perché non so se il tuo array in lettura parta da 0 o da 1.
Se parte da 0 i primi 24 bit vanno da 0 a 23. 0-22 i dati e 23 il segno. E il secondo gruppo da 24 a 47, 24-46 i dati e 47 il segno.
Viceversa se parte da 1 avrai da 1 a 24 il primo pacchetto con 1-23 i dati e 24 il segno e l'altro sarà da 25 a 48 con 25-47 di dati e il 48° il segno.
e si qui ti volevo

cosi la fai troppo semplice
il problema è, che la codifica non porta SOLO a livello alto il bit piu significativo
ma il bit piu significativo va alto perche e trasformato in complemento a due
se elimini il bit piu significativo rimangono sempre gli altri 23 bit invertiti
che va aggiunto anche un bit
faccio un esempio e solo un esempio per capire)
numero bin 000000000000000000000
numero bin trasformato in complemento a 1 111111111111111111111
numero bin trasformato incomplemento a 2 111111111111111111110
se non prendo il bit piu significativo ottengo 11111111111111111110 che e sempre un numero enorme
e se lo moltiplico per -1 otterro sempre un numero enorme negativo
quando in realta il numero bin originale e un numero piccolissimo