Ok, to jest dziwny problem:Unsigned Long Long poza zakresem?
- Używam
unsigned long long
zmiennych (Użyłem nawetlong
te, z tym samym skutkiem) - muszę aby móc przechowywać 64- bitowe liczby całkowite (
sizeof
powraca 8, co jest w porządku)
jednak, gdy staram się iść do wartości jak 1<<63
i wykonać kilka prostych czynności bitowe, i - dziwnie - wydają się być coraz wartości ujemne. Dlaczego tak jest?
Mój kod testowy:
unsigned long long c = 0;
c |= 1l << 56; printf("c = %lld\n",c);
c |= 1l << 63; printf("c = %lld\n",c);
wyjściowa:
c = 72057594037927936
c = -9151314442816847872
Sidenotes:
- Oczywiście, to samo dzieje się, nawet jeśli wykonuję
c = 1l<<63
bezpośrednio. - Wszystkie testy wykonane w systemie Mac OS X 10.6 i skompilowany przy użyciu kompilatora LLVM Apple 3,0
sugestie?
Jeśli * potrzebujesz * 64-bitowych liczb całkowitych, możesz użyć uint64_t. –
Wiem, że już wybrałeś odpowiedź, ale wciąż mam pytanie: Czy kompilujesz 64-bitowy rdzeń? Co to jest "sizeof (long)"? Jestem zaskoczony, że '1l << 63' działa, jak bym pomyślał, że przesunie 32-bitowe' 1l' w górę o 63 bity, pozostawiając ci wartość zero. Ale jeśli 'sizeof (long)' to także 8, może dlatego działa. Jeśli mam rację, odpowiedź Jessego Rusaka jest trochę prawidłowa, nawet jeśli ta odpowiedź nie rozwiązałaby twojego problemu. – phonetagger
Tak, '1l' naprawdę powinno być' 1ull', aby zagwarantować, że ma on co najmniej 64 bity. – AusCBloke