我试图以字节为单位表示16gb,而uint64_t
会抛出错误。
我应该使用哪种数据类型来表示它?
unsigned long int
也会抛出错误。
error: integer overflow in expression [-Werror=overflow]
uint64_t TESTBYTES = 16 * 1024 * 1024 * 1024;
答案 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)值,您应该将ULL
或ull
后缀添加到其中一个操作数(除了注释中指出的最后一个) )以便整个表达式被评估为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;
}