2011-09-18 40 views
2

我使用Eclipse CDT - 在Windows 7上跨G ++编者(MinGW的/ MSYS),这是我的代码:的int64_t溢出问题

int64_t y = 1024 * 1024 * 1024 * 4; 
std::cout << "type id: " << typeid(y).name() << "; value: " << y << "; size of y: " << sizeof(y) << std::endl; 

(IDE会警告: “整数溢出”。)

输出是:

"type id: x; value: 0; size of y: 8" 

我不明白,为什么Y的大小为8个字节,但值为0

感谢您的帮助。

回答

3

你应该明确地转换字面来int64_t

int64_t y = (int64_t)1024 * 1024 * 1024 * 4; 

1024 * 1024 * 1024 * 4文字是int,不int64_t

1

当写入“1024”在C++表达式,像在您的问题,写一个整数文字,其尺寸为4个字节,即32位(如它的类型将是intunsigned int) ,所以最后乘以4使得4字节的整数溢出。试试这个:

int64_t y = ((int64_t)1024) * 1024 * 1024 * 4; 
+0

'1024'类型为'int',它可以是也可以不是32位,可以是也可以不是4个字节。 –

+0

在“Eclipse CDT,Cross G ++ Complier”中,“int”的大小没有“可能或不可能”,并且它总是一些不变的数字,最可能是4个字节。但是,是的,C++标准没有指定“int”的大小,由编译器决定。 –

+0

一个小点:外括号是不必要的:'int64_t y =(int64_t)1024 * 1024 * 1024 * 4;' –

2

,你将结果分配到int64_t是无关紧要的事实。重要的是,当您乘以int类型的两个值时,结果也有类型int。由于所有1024,1024,1024和4都是int类型的常量,因此产生的临时产品计算为int,该值溢出。

解决方案是使这些常数中的至少一个为int64_tint64_tint的乘积为int64_t,因此64位将级联贯穿整个产品。您可以使用有明确的转换或整数后缀做到这一点:

int64_t y = (int64_t)1024 * 1024 * 1024 * 4; // explicit cast 
int64_t y = 1024ll * 1024 * 1024 * 4; // integer suffix 'll' 

整型常量后说后缀ll(或等价LL)“这个值是真的long long”。还有ull(或ULL)后缀,它用于unsigned long long。另请注意,C语言标准保证long long至少为64位。

+0

为了便于阅读,请使用1024LL而不是102411。而“long long”必须至少为64位;它不值得担心它可能不会。 –