2012-06-17 28 views
5

Tôi đã cố gắng để thực thi mã này thông qua trình biên dịch gcc:sản lượng kỳ lạ mà không typecasting

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = 75000 * 75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

Nhưng nó đã cho ra sai.

sau đó tôi đã cố gắng này:

#include <stdio.h> 
int main() 
{ 
    unsigned long long int x; 
    x = (unsigned long long)75000 * (unsigned long long)75000; 
    printf ("%llu\n", x); 
    return 0; 
} 

Và nó đã cho ra đúng!

Tại sao lại như vậy?

+1

Lưu ý rằng bạn chỉ cần truyền một trong các hằng số để quảng bá toàn bộ biểu thức. – Clifford

Trả lời

9

Biểu thức 75000 * 75000 là phép nhân của hai hằng số nguyên. Kết quả của biểu thức này cũng là một số nguyên và có thể tràn. Kết quả sau đó được gán cho một unsigned long long, nhưng nó đã overflowed nên kết quả là sai.

Để viết các hằng số dài chưa được ký sử dụng hậu tố ULL.

x = 75000ULL * 75000ULL; 

Bây giờ nhân sẽ không tràn.