2013-04-12 35 views
12

Giả sửdài là 8 byte, nhưng tôi bị tràn số nguyên?

long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits 
    printf ("%lu\n",sizeof(long long)); // prints 8 (bytes) = 64 bits 

nhưng trình biên dịch phàn nàn:

warning: integer overflow in expression [-Woverflow] 

Tại sao nó tràn, tôi thiếu gì?

Trả lời

19

Vì các số ở bên tay phải thuộc loại int, không phải long long, do đó, số int được thực hiện trong biểu thức, dẫn đến tràn.

Nếu bạn thêm LL vào một trong số chúng, nó sẽ quảng bá tất cả.

+0

darn, bạn nói đúng. Người ta luôn nghĩ đến việc phụ thêm f hoặc (casting) float ... nhưng không bao giờ mong đợi: (Đánh giá cao nó) –

+0

@DervinThunk - thật dễ dàng để quên đi các hằng số – teppic

+0

Chính xác hơn, hằng số có kiểu 'int' (" số nguyên "là một thuật ngữ tổng quát hơn, bao gồm tất cả mọi thứ từ 'char' đến' long long' và có thể nhiều hơn nữa. Và nếu bạn áp dụng 'LL' ở bên phải' 1024', bạn vẫn có thể bị tràn, với '5 * 1024 * 1024 * 1024LL', '5 * 1024 * 1024' vẫn được đánh giá là một' int' - có thể được thu hẹp một cách hợp pháp như 16 bit. Giải pháp mạnh mẽ nhất có lẽ là viết '5LL * 1024LL * 1024LL * 1024LL' - hoặc '5LL * (1LL << 30)' –

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