2012-02-29 18 views
5

Trong trường hợp của tôi, sản phẩm của hai số INT_MAX là 296447233, không chính xác.Sản phẩm không chính xác của hai INT_MAX nếp gấp trong C/C++

long long int product = 0; 
product = 2137483647 * 2137483647; 
printf("product: %lli\n", product); 

Điều tôi đang làm sai và cách sửa lỗi? Cảm ơn!

+2

Um. ..INT_MAX là 2147483647 (đối với 32-bi t ints). Bạn đang nhút nhát bởi 10000000. –

+0

Ồ, không !!!!!! Ye, tôi đã sai INT_MAX. Cảm ơn đã chỉ ra điều đó ! – newprint

Trả lời

14

Cả hai số 2137483647 của bạn thuộc loại int. Vì vậy, họ ở lại loại và tràn.

Làm cho họ long long s:

product = 2137483647LL * 2137483647LL; 

hoặc dàn diễn viên:

product = (long long)2137483647 * 2137483647; 
+0

Vì vậy, về cơ bản, sản phẩm của hai ints chỉ tràn, mặc dù tôi đang gán nó cho dài dài int? Cảm ơn bạn đã trả lời! – newprint

+4

Đúng. Trong ví dụ của bạn, chuyển đổi xảy ra * sau * nhân. Vì vậy, nó tràn trước khi nó được thăng thành 'long long'. – Mysticial

+1

Trình biên dịch sẽ xử lý hai số là ints, thực hiện các phép toán và sau đó suy nghĩ về việc đặt giá trị vào 'sản phẩm'. –

6

Hãy thử

product = 2137483647LL * 2137483647LL; 

để đảm bảo rằng các biên dịch xử lý các con số càng lâu dài

+0

Ồ và tôi đã +1 để chỉ ra 'LL'. – Mysticial

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