2016-05-19 15 views
6

Đây là mã của tôigcc "tràn trong khái niệm" thời gian tương đương biểu thức tương đương hoạt động tốt

#include <iostream> 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 
static const unsigned long long int y = 36 * 36 * 36 * 36; 
static const unsigned long long int yy = y * y; 

int main() 
{ 
    std::cout << xx << std::endl; 
    std::cout << yy << std::endl; 
    return 0; 
} 

sản lượng biên soạn này

# g++ -std=c++11 test.cpp -o test 
test.cpp:2:62: warning: integer overflow in expression [-Woverflow] 
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

Đây là sản lượng thực hiện

# ./test 
18446744073025945600 
2821109907456 

Can bạn giải thích tại sao tôi thấy cảnh báo này và kết quả khác? nếu 36 có thể phù hợp với char sau đó 36^8 có thể phù hợp trong unsigned dài dài int vì vậy tôi không chắc chắn những gì là vấn đề ở đây, xin vui lòng tư vấn cho. (Tôi đang sử dụng gcc 4.9.2)

+0

Điều này có vẻ là một quan niệm sai lầm rất phổ biến: Đó là một ý định sau đó bằng cách nào đó ảnh hưởng đến ý nghĩa của mã trước đó. (Trường hợp "sớm hơn" và "sau này" đề cập đến thứ tự bao gồm subexpression.) Đây không phải là trường hợp trong C++; gần nhất bạn nhận được một số hiệu ứng như vậy là quá tải độ phân giải trên toán hạng của địa chỉ của bên trong một diễn viên. –

Trả lời

10
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

36 đã gõ int

36 * 36 đã gõ int

(36 * 36 * 36 * 36) đã gõ int

(36 * 36 * 36 * 36) * (36 * 36 * 36 * 36) đã gõ int và tràn , đó là hành vi thực sự không xác định đối với các loại đã ký.

Có thể bạn muốn

static const unsigned long long int xx = (36ull * 36 * 36 * 36) * (36 * 36 * 36 * 36); 

Đối với trường hợp thứ hai:

static const unsigned long long int yy = y * y; 

y có kiểu unsigned long long

y * y có kiểu unsigned long long nên không tràn.

+1

Typo - hành vi không xác định đối với các loại chưa ký - nghĩa là bạn đã ký, phải không? – Rostislav

+0

@Rostislav Ahem ... cảm ơn: D – user657267

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