int8_t和int64_t的最小值

时间:2013-04-16 09:20:23

标签: c++

关于stdint.h中的定义,我希望测试一个函数,用于将int8_t的向量或int64_t的向量转换为std::string的向量。< / p>

以下是我的测试:

TEST(TestAlgorithms, toStringForInt8)
{
    std::vector<int8_t> input = boost::assign::list_of(-128)(0)(127);
    Container container(input);
    EXPECT_TRUE(boost::apply_visitor(ToString(),container) == boost::assign::list_of("-128")("0")("127"));
}

TEST(TestAlgorithms, toStringForInt64)
{
    std::vector<int64_t> input = boost::assign::list_of(-9223372036854775808)(0)(9223372036854775807);
    Container container(input);
    EXPECT_TRUE(boost::apply_visitor(ToString(),container) == boost::assign::list_of("-9223372036854775808")("0")("9223372036854775807"));
}

但是,我在视觉工作室收到警告线:

std::vector<int64_t> input = boost::assign::list_of(-9223372036854775808)(0)(9223372036854775807);

如下:

warning C4146: unary minus operator applied to unsigned type, result still unsigned

如果我将-9223372036854775808更改为-9223372036854775807,则警告消失。

这是什么问题?关于我的原始代码,测试正在通过。

3 个答案:

答案 0 :(得分:11)

就像编译器说的那样,-9223372036854775808不是有效数字,因为-和数字是分开处理的。

您可以尝试使用-9223372036854775807 - 1或使用std::numeric_limits<int64_t>::min()

答案 1 :(得分:3)

问题是整数文字不是负面的;因此,-42不是具有负值的文字,而是应用于文字-的{​​{1}}运算符。

在这种情况下,42超出了9223372036854775808的范围,因此它将被赋予无符号类型。由于模块化算术的神奇之处,您仍然可以否定它,将其分配给int64_t,最终得到您期望的结果;但编译器会警告你无符号否定(如果你告诉它),因为这通常是错误的结果。

您可以使用int64_t来避免警告(并使代码更明显正确)。

答案 2 :(得分:2)

-9223372036854775808更改为-9223372036854775807-1

问题是-9223372036854775808不是-9223372036854775808而是-(9223372036854775808)9223372036854775808无法符合带符号的64位类型(默认情况下十进制整数常量为a签名类型),所以它变成无符号。将-的否定应用于无符号类型是可疑的,因此警告。