Ok, đây là một vấn đề kỳ lạ:Unsigned Long Long nằm ngoài phạm vi?
- Tôi đang sử dụng
unsigned long long
biến (Tôi đã sử dụng ngay cảlong
người, với tác dụng tương tự) - tôi cần để có thể lưu trữ 64 số nguyên bit (
sizeof
lợi nhuận 8, đó là tốt)
Tuy nhiên, khi tôi đang cố gắng để đi đến giá trị như 1<<63
, và thực hiện một số hoạt động Bitwise đơn giản, tôi - kỳ quặc - dường như nhận được giá trị âm. Tại sao vậy?
mã kiểm tra của tôi:
unsigned long long c = 0;
c |= 1l << 56; printf("c = %lld\n",c);
c |= 1l << 63; printf("c = %lld\n",c);
Output:
c = 72057594037927936
c = -9151314442816847872
Sidenotes:
- Tất nhiên, điều tương tự cũng xảy ra ngay cả khi tôi thực hiện trực tiếp
c = 1l<<63
. - Tất cả các bài kiểm tra được thực hiện trên Mac OS X 10.6, và biên soạn sử dụng của Apple LLVM Compiler 3,0
Bất kỳ lời đề nghị?
Nếu bạn cần * số nguyên 64 bit, bạn có thể thích sử dụng uint64_t. –
Tôi biết bạn đã chọn câu trả lời nhưng tôi vẫn có câu hỏi: Bạn có đang biên soạn lõi 64 bit không? 'Sizeof (long)' là gì? Tôi ngạc nhiên rằng '1l << 63' hoạt động, vì tôi đã nghĩ rằng nó sẽ chuyển một bit 32 bit 1l' lên 63 bit, để lại cho bạn một giá trị bằng không. Nhưng nếu 'sizeof (long)' cũng là 8, có lẽ đó là lý do tại sao nó hoạt động. Nếu tôi đúng, thì có một số sự thật với câu trả lời của Jesse Rusak, mặc dù câu trả lời đó không giải quyết được vấn đề của bạn. – phonetagger
Yeah '1l' thực sự nên là' 1ull' để đảm bảo rằng nó dài ít nhất 64 bit. – AusCBloke