5

关于在 中找到的那些定义stdint.h,我希望测试一个函数,用于将 的向量int8_t或 的向量转换为 的int64_t向量std::string

这是我的测试:

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"));
}

但是,我在 Visual Studio 中收到了一条警告:

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,警告就会消失。

这里有什么问题?关于我的原始代码,测试通过了。

4

3 回答 3

14

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

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

于 2013-04-16T09:25:01.003 回答
3

问题是整数文字不是负数。so-42不是具有负值的文字,而是-应用于文字的运算符42

在这种情况下,9223372036854775808超出 的范围int64_t,因此将被赋予无符号类型。由于模运算的魔力,您仍然可以对它取反,将其分配给int64_t,并最终得到您期望的结果;但是编译器会警告您有关无符号否定(如果您告诉它),因为这通常是错误的结果。

您可以通过使用来避免警告(并使代码更明显正确)std::numeric_limits<int64_t>::min()

于 2013-04-16T09:26:45.573 回答
2

更改-9223372036854775808-9223372036854775807-1

问题在于它-9223372036854775808不是,-9223372036854775808而是不能适应带符号的 64 位类型(十进制整数常量默认是带符号的类型),所以它变成了无符号的。对无符号类型应用否定是可疑的,因此会发出警告。-(9223372036854775808)9223372036854775808-

于 2013-04-16T09:27:20.140 回答