CPP错误:表达式中的整数溢出

时间:2017-11-10 08:14:18

标签: c++ types

我试图以字节为单位表示16gb,而uint64_t会抛出错误。

我应该使用哪种数据类型来表示它? unsigned long int也会抛出错误。

error: integer overflow in expression [-Werror=overflow]
         uint64_t TESTBYTES = 16 * 1024 * 1024 * 1024;

2 个答案:

答案 0 :(得分:5)

uint64_t TESTBYTES = 16ULL * 1024 * 1024 * 1024会这样做。

否则,16 * 1024 * 1024 * 1024表达式被评估为int,您的平台上的结果未定义,因为您的int类型溢出。

ULL将第一个字词提升为unsigned long long,强制推广其他字词。这总是安全的,unsigned long long需要至少 64位。

答案 1 :(得分:1)

按原样,你的表达式由integer literals组成,没有后缀,将被评估为有符号整数,值将溢出。表达式的结果是17179869184,32位整数可以容纳的最大值是2147483647,因此它会溢出。要强制将表达式计算为无符号(在您的情况下为unsigned long long)值,您应该将ULLull后缀添加到其中一个操作数(除了注释中指出的最后一个) )以便整个表达式被评估为unsigned long long。用于演示会发生什么的简单示例:

#include <iostream>
#include <cstdint>
#include <limits>

int main() {
    uint64_t x; // unsigned long long
    auto y = 16 * 1024 * 1024 * 1024; // evaluated as int, the result overflows
    auto z = 16ull * 1024 * 1024 * 1024; // evaluated as unsigned long long, does not overflow
    std::cout << "Your expression: " << z << '\n';
    std::cout << "Maximum integer value: " << std::numeric_limits<int>::max() << '\n';
    std::cout << "Maximum unsigned long long value: " << std::numeric_limits<unsigned long long>::max() << '\n';
    x = z;
}