关于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,则警告消失。
这是什么问题?关于我的原始代码,测试正在通过。
答案 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签名类型),所以它变成无符号。将-
的否定应用于无符号类型是可疑的,因此警告。