You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使含unsigned变量的C++左右移动代码适配统一<条件判断?

适配unsigned变量的循环条件修正方案

原程序在x、b为有符号int时能正常实现需求:左移时x小于b打印,右移时x大于b打印,但改成size_t这类unsigned类型后,因k=-1触发的整型提升和乘法溢出,导致条件判断彻底失效。要求保留单个while循环和<符号,这里给出一个无溢出的数学适配方案:

核心修改

把原条件if (k*x < b*k)替换为:

if ((long long)(x - b) * k < 0)

逻辑说明

  • 左移场景(k=1):
    当x < b时,unsigned类型的x - b会溢出成一个极大值,强制转成long long后是负数,乘1后还是负数,满足<0的条件,触发打印;x >= b时,x - b是正数值,转long long后乘1为正,不触发条件,逻辑正确。
  • 右移场景(k=-1):
    当x > b时,x - b是正unsigned值,转long long后乘-1变成负数,满足<0的条件,触发打印;x <= b时,x - b溢出成极大值,转long long后是负数,乘-1变成正数,不触发条件,完全符合需求。

完整适配代码

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    size_t x, b = 3;
    
    char const *c = "moving_left"; // 改成"moving_right"可测试右移逻辑
    int k;
    size_t border;
    
    if (!strcmp(c,"moving_left"))
    {
        k = 1;     // 左移,x递减
        border = 0;
        x = 5;
    }
    else
    {
        k=-1;     // 右移,x递增
        border = 7;
        x = 1;
    }
    
    while(true)
    {
        if ((long long)(x - b) * k < 0)
        {
            cerr << c << x << '\n';
            if (x == border){break;}
        }
        x -= k; // unsigned下x -= -1等价于x+1,递增逻辑正常
    }
    return 0;
}

注意事项

如果你的平台上size_t是64位,确保long long也是64位(现在大部分平台都满足);要是想更通用,可以用<cstdint>里的intmax_t替换long long,避免转换溢出。

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:55:25