Utilizzo dei 16 bit in più nei puntatori a 64 bit

Ho letto che una macchina a 64 bit effettivamente utilizza solo 48 bit di indirizzo (in particolare, sto usando Intel Core i7).

Mi aspetterei che i 16 bit in più (bit 48-63) siano irrilevanti per l’indirizzo e verrebbero ignorati. Ma quando provo ad accedere a questo indirizzo, ho ricevuto un segnale EXC_BAD_ACCESS .

Il mio codice è:

 int *p1 = &val; int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant int v = *p2; //Here I receive a signal EXC_BAD_ACCESS. 

Perché è così? C’è un modo per usare questi 16 bit?

Questo potrebbe essere usato per creare più elenchi collegati cache-friendly. Invece di utilizzare 8 byte per il successivo ptr e 8 byte per la chiave (a causa della restrizione di allineamento), la chiave potrebbe essere incorporata nel puntatore.