在C++中,当无符号数和有符号数进行减法运算时,通常有符号数会被转换为无符号数

一段程序引发的问题:

cpp 复制代码
 for (int i = 0; i <= s.length() - L; ++ i) {
       string str = s.substr(i, L);
        if (++ hash[str] == 2) {
            res.push_back(str);
        }
    }
}
bash 复制代码
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 2) > this->size() (which is 1)

在C++中,当无符号数和有符号数进行减法运算时,通常有符号数会被转换为无符号数,然后进行无符号算术运算,结果也是一个无符号数。这是由C++的整数提升和算术转换规则所决定的,被称为 "usual arithmetic conversions"。

例如:

cpp 复制代码
unsigned int a = 5;
int b = 10;
auto c = a - b;

在这个例子中,b 被转换为一个相应的无符号数,然后再与 a 相减。如果 b 的值足够大以至于在转换为无符号数时不会导致负数,那么得到的结果是正常的。但是如果 b 较大(例如在本例中的10),转换结果会是一个非常大的无符号数,因为无符号整数不能表示负数。这个转换是按照模运算的方式来处理的,即加上或减去足够大的2的幂次,使结果适合无符号类型的表示范围。

回到上面的代码段中,s.length() 是一个 size_t 类型,即无符号类型。当与 L 这个有符号整数做减法时,L 会被转换为 size_t 类型,然后执行减法操作,结果也是 size_t 类型。如果 s.length() 小于 L,则会发生上述的整数环绕(underflow),导致计算出一个非常大的无符号数,从而导致循环条件错误地评估为 true

相关推荐
居7然43 分钟前
DeepSeek OCR:重新定义AI文档处理的“降本增效”新范式
人工智能·算法·语言模型·自然语言处理·大模型·ocr
while(1){yan}1 小时前
数据结构之堆
数据结构·python·算法
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-16 属性菜单 - 构建
c++·游戏·ue5·游戏引擎·虚幻
天***88961 小时前
Edge浏览器无法安装扩展CRX_REQUIRED_PROOF_MISSING扩展的按钮开关为灰色,无法启用
c++
SleepyWhite0011 小时前
代码随想录Day61|Floyd 算法精讲、A * 算法精讲
算法·floyd算法·astar算法
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 84: 乘积为正数的最长子数组长度
数据结构·算法·leetcode·贪心算法·线性回归·深度优先·动态规划
云知谷2 小时前
【经典书籍】C++ Primer 第19章特殊工具与技术精华讲解
c语言·开发语言·c++·软件工程·团队开发
雾岛听蓝2 小时前
C语言:使用顺序表实现通讯录
c语言·数据结构·经验分享·笔记·visualstudio
不是老弟2 小时前
rwqsd
数据结构·c++·算法