2010-07-21 34 views
6

Tôi có một vấn đề nhỏ. Về cơ bản, mã:Dung lượng của uint64_t?

uint64_t myInteger = 98930 * 98930; 
NSLog(@"%qu", myInteger); 

... chỉ bị sai. Tôi nhận được '1197210308' là đầu ra, rõ ràng là không chính xác. Tại sao chuyện này đang xảy ra? Không thể là uint64_t quá nhỏ, vì chúng dường như đi lên đến 18 and a half quintillion. Bất cứ ai có bất kỳ ý tưởng?

Trả lời

9

Hãy thử casting số đầu tiên để các hoạt động được thực hiện sử dụng loại rằng:

uint64_t myInteger = (uint64_t)98930 *98930; 
+6

Hoặc: 'uint64_t myInteger = 98930UL * 98930UL;' –

+0

Đúng vậy. Nó hoạt dộng bây giờ. Cảm ơn! –

+0

Hoặc thậm chí tốt hơn: UINT64_C (98930) * UINT64_C (98930) – nall

2

Tôi không biết nhiều về mục tiêu-C, nhưng làm như vậy trong C, chương trình khuyến mãi nguyên dừng lại ở cấp bậc số nguyên , vì vậy bạn sẽ nhận được tràn số nguyên. Hãy thử:

uint64_t myInteger = 98930LLU * 98930; 
8

98930 là một int, vì vậy bạn nhân hai int s, mang đến cho một int. Sau đó, bạn chỉ định cho một số uint64_t, nhưng đã quá muộn, bạn đã mất độ chính xác. Đảm bảo một trong các toán hạng có loại uint64_t, vì vậy toán hạng còn lại sẽ bị ép buộc cho loại đó và phép nhân sẽ được thực hiện dưới dạng số uint64_t.

+0

Điều đó giải thích rõ, cảm ơn! –

Các vấn đề liên quan