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ì?
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ó) –
@DervinThunk - thật dễ dàng để quên đi các hằng số – teppic
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)' –