Stanislav Petrov Asked:2020-06-07 17:57:14 +0000 UTC2020-06-07 17:57:14 +0000 UTC 2020-06-07 17:57:14 +0000 UTC 整数常量溢出 772 为什么会发生溢出。 #include <cstddef> #include <iostream> int main() { std::size_t max = 1000000 * 1000 * 4; } 警告 C4307*:整数常量溢出 c++ 3 个回答 Voted ffk 2020-06-07T18:02:32Z2020-06-07T18:02:32Z 1000000 * 1000 * 4 == 4 000 000 000,但这是如果unsigned int。在这种情况下int(1000000) * int(1000) * int(4)- 这是一个溢出int,它等于-294967296。此外,为该类型分配了一个负数unsigned-事实证明是无稽之谈 Best Answer nick_n_a 2020-06-08T18:10:34Z2020-06-08T18:10:34Z 常量(包含一个数字)默认解释为 32 位有符号整数(您的值缺少一位 31 位 + 1 位有符号),但您的类型是 32 位无符号 (size_t),因此您需要指定一个“后缀”——在这种情况下是文字的类型U。数字常量称为文字(整数文字或整数文字)。 std::size_t max = 1000000U * 1000* 4; 一个“字面量”的类型由第一个字面量决定,其余的都参与运算——编译器根据第一个字面量的类型进行转换,所以后面的两个 U 可以省略。 简而言之,整数文字:U- 无符号、L-long(32 位)、UL= 无符号 32 位、LL-64 位有符号(C++11 标准)、ULL-64 位无符号(也)。(长度U与长度相同unsigned int,在某些编译器上长度可能不是 32。) 更多细节https://en.cppreference.com/w/cpp/language/integer_literal 如果编译器发誓 1000000LL - 那么你的编译器不支持这种类型的文字 - 你将不得不完整地写下这个数字。如果您仍然需要“合并代码” - 您可以使用#define它(通常他们会尽量避免这种结构,但在这种情况下我认为它可以应用)。例如像这样 #define triple_const(a,b,c) a##b##c std::size_t max = triple_const(4,000000,000) 还有其他类型的文字(字符串、布尔值、浮点数等)。 AnT stands with Russia 2020-06-08T23:11:53Z2020-06-08T23:11:53Z 您正在尝试评估表达式的值1000000 * 1000 * 4。此表达式的所有操作数都是类型int,并且整个表达式在类型域内求值int。但是您平台上的这个表达式无法在类型域的范围内进行评估int- 发生溢出。编译器会告诉你这一点。
1000000 * 1000 * 4 == 4 000 000 000,但这是如果unsigned int。在这种情况下int(1000000) * int(1000) * int(4)- 这是一个溢出int,它等于-294967296。此外,为该类型分配了一个负数unsigned-事实证明是无稽之谈常量(包含一个数字)默认解释为 32 位有符号整数(您的值缺少一位 31 位 + 1 位有符号),但您的类型是 32 位无符号 (size_t),因此您需要指定一个“后缀”——在这种情况下是文字的类型
U。数字常量称为文字(整数文字或整数文字)。一个“字面量”的类型由第一个字面量决定,其余的都参与运算——编译器根据第一个字面量的类型进行转换,所以后面的两个 U 可以省略。
简而言之,整数文字:
U- 无符号、L-long(32 位)、UL= 无符号 32 位、LL-64 位有符号(C++11 标准)、ULL-64 位无符号(也)。(长度U与长度相同unsigned int,在某些编译器上长度可能不是 32。)更多细节https://en.cppreference.com/w/cpp/language/integer_literal
如果编译器发誓 1000000LL - 那么你的编译器不支持这种类型的文字 - 你将不得不完整地写下这个数字。如果您仍然需要“合并代码” - 您可以使用
#define它(通常他们会尽量避免这种结构,但在这种情况下我认为它可以应用)。例如像这样还有其他类型的文字(字符串、布尔值、浮点数等)。
您正在尝试评估表达式的值
1000000 * 1000 * 4。此表达式的所有操作数都是类型int,并且整个表达式在类型域内求值int。但是您平台上的这个表达式无法在类型域的范围内进行评估int- 发生溢出。编译器会告诉你这一点。