int8_t和int64_t的最小值

Smallest values for int8_t and int64_t

本文关键字:最小值 int8 int64      更新时间:2023-10-16

对于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,则警告消失。

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

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

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

问题是整数字面值不是负的;因此,-42不是一个带负值的字面值,而是将-运算符应用于字面值42

在这种情况下,9223372036854775808不在int64_t的范围内,因此它将被赋予unsigned类型。由于模运算的魔力,你仍然可以否定它,将它赋值给int64_t,并最终得到你期望的结果;但是编译器会警告你unsigned否定(如果你告诉它),因为这通常是错误的结果。

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

-9223372036854775808更改为-9223372036854775807-1

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