Ok, questo è un problema strano:Non firmato a lungo Fuori intervallo?
- sto usando
unsigned long long
variabili (ho usato anchelong
quelli, con lo stesso effetto) - ho bisogno di essere in grado di memorizzare 64 interi bit (
sizeof
restituisce 8, che va bene)
Tuttavia, quando sto cercando di andare a valori come 1<<63
, ed eseguire alcune semplici operazioni bit per bit, I - stranamente - sembrano essere sempre valori negativi. Perché?
mio codice di prova:
unsigned long long c = 0;
c |= 1l << 56; printf("c = %lld\n",c);
c |= 1l << 63; printf("c = %lld\n",c);
uscita:
c = 72057594037927936
c = -9151314442816847872
Note a margine:
- Naturalmente, la stessa cosa accade anche se faccio direttamente
c = 1l<<63
. - Tutti i test effettuati su Mac OS X 10.6, e compilati utilizzando Apple LLVM compilatore 3,0
Qualche suggerimento?
Se * hai * numeri interi a 64 bit, potresti preferire usare uint64_t. –
So che hai già selezionato una risposta, ma ho ancora una domanda: stai compilando per un core a 64 bit? Qual è 'sizeof (long)'? Sono sorpreso che '1l << 63' funzioni, come avrei pensato che avrebbe spostato un' 1l' a 32 bit di 63 bit, lasciando il valore zero. Ma se 'sizeof (long)' è anche 8, forse è per questo che funziona. Se ho ragione, allora c'è un po 'di verità nella risposta di Jesse Rusak, anche se quella risposta non risolverà il tuo problema. – phonetagger
Sì, il '1l' dovrebbe essere' 1ull' per garantire che sia lungo almeno 64 bit. – AusCBloke