如何使含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
相关产品推荐
相关产品推荐

