Đâ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)
Đ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. –