0

这应该只是将 1 添加到 unsigned int:prev = nums[nextIndex + 1];但它给出了一个警告说

算术溢出:对 4 字节值使用运算符“+”,然后将结果转换为 8 字节值。在调用运算符“+”之前将值转换为更广泛的类型以避免溢出

但我没有使用任何 8 字节值,它们都是 32 位整数......为什么它为我将东西转换成 8 字节值?

我在 LeetCode 上做一些问题,所以这里是我正在处理的问题的完整代码,只是旋转一个整数向量:

    void rotate(std::vector<int>& nums, int k) {
        k %= nums.size();
        if (k > 0) {
            unsigned int offsetCounter = 0; 
            int prev;
            int next = nums[0];
            for (unsigned int i = 0; i < nums.size(); i++) {


                int f = k * i;

                unsigned int nextIndex = ((unsigned int)((unsigned int)k * ((unsigned int)i + (unsigned int)1)) + (unsigned int)offsetCounter) % (unsigned int)nums.size();

                if (nextIndex == offsetCounter) {
                    offsetCounter++;
                    prev = nums[nextIndex + 1];
                }
                else
                {
                    prev = nums[nextIndex];
                }
                nums[nextIndex] = next;
                next = prev;
            }
        }
    }

nextIndex也给出了相同的警告,唯一摆脱它的是将所有内容都转换为无符号整数。我不明白为什么当我绝对不​​使用 8 字节值时它说我使用的是 8 字节值。过去我忽略了这样的警告,但 LeetCode 非常重视它们。谢谢你。

4

2 回答 2

1

矢量索引(和std::vector::size())是size_ts,而不是unsigned ints,这就是您的问题所在。

要解决此问题,请将所有unsigned int变量声明为size_t并删除所有这些强制转换:

void rotate(std::vector<int>& nums, size_t k) {
    k %= nums.size();
    if (k > 0) {
        size_t offsetCounter = 0; 
        int prev;
        int next = nums[0];
        for (size_t i = 0; i < nums.size(); i++) {
            size_t nextIndex = (k * i + 1 + offsetCounter) % nums.size();

            if (nextIndex == offsetCounter) {
                offsetCounter++;
                prev = nums[nextIndex + 1];
            }
            else
            {
                prev = nums[nextIndex];
            }
            nums[nextIndex] = next;
            next = prev;
        }
    }
}

现场演示

于 2021-07-18T23:28:18.860 回答
1

operator[]instd::vector定义为

constexpr reference operator[]( size_type pos );

加上几个类似的重载,都采用由 .size_type定义的类型的参数std::vector。Cppreference.com 关于这种类型是这样说的:

无符号整数类型(通常为 std::size_t)

关于std::size_t(部分)的解释:

std::size_t 通常用于数组索引和循环计数。使用其他类型(如 unsigned int)进行数组索引的程序可能会在索引超过 UINT_MAX 或依赖于 32 位模运算时在 64 位系统上失败。

在索引 C++ 容器时,例如 std::string、std::vector 等,适当的类型是此类容器提供的成员 typedef size_type。它通常被定义为 std::size_t 的同义词。

So:std::vector使用通常等同于 的类型进行索引std::size_t,在您的机器上是 64 位无符号整数。

因此,如果您希望警告消失,您可以定义nextIndex为 64 位无符号整数,例如

  • unsigned long nextIndex或者
  • size_t nextIndex;
  • std::vector<int>::size_type nextIndex;

或通过使用类型为 的常量强制转换unsigned ling long

prev = nums[nextIndex + 1ull];
于 2021-07-18T23:37:46.240 回答