【重学C++】简单却致命!C++ unsigned int与int类型进行比较的坑

大家好,我是 同学小张,+v: jasper_8017 一起交流,持续学习C++进阶、OpenGL、WebGL知识AI大模型应用实战案例,持续分享,欢迎大家点赞+关注,共同学习和进步。


在 C++ 编程中,对整数类型的操作是最常见的任务之一。然而,当涉及到 unsigned int(无符号整型)和 int(有符号整型)的比较时,一不注意就可能会遇到一些意想不到的结果。本文将通过代码示例、运行结果和原理讲解,帮助你理解这些“坑”。

原理很简单,代码也很简单,但一旦不注意出现了,查起来很头大…

代码示例

首先,让我们来看一个简单的代码示例,演示 unsigned intint 进行比较时可能遇到的问题。

#include <iostream>

int main() {
    unsigned int u = 10;
    int i = -10;

    if (u > i) {
        std::cout << "u is greater than i" << std::endl;
    } else {
        std::cout << "u is not greater than i" << std::endl;
    }

    return 0;
}

运行结果

如果你运行上面的代码,你可能会期待输出是 "u is greater than i",因为 10 显然大于 -10。然而,实际的输出却是:

u is not greater than i

原理讲解

无符号与有符号整数的比较

在 C++ 中,unsigned intint 都是整型,但它们的表示范围不同。unsigned int 只能表示非负整数,而 int 可以表示正整数、负整数和零。

unsigned intint 进行比较时,int 会被隐式转换为 unsigned int。这个转换是通过将 int 的二进制表示直接解释为 unsigned int 来完成的。这意味着负数在转换过程中会变成一个非常大的正数。

转换过程

以上面的代码为例,int i = -10; 在内存中可能表示为补码形式的二进制 11111111111111111111111111110110(假设是 32 位系统)。当这个值被转换为 unsigned int 时,它会被解释为一个非常大的正数,大约是 4294967286(即 (2^{32} - 10))。

因此,比较 u > i 实际上变成了 10 > 4294967286,这显然是不成立的。

如何避免这个坑

为了避免这种类型转换导致的问题,你可以采取以下措施:

  1. 显式类型转换:在比较之前,显式地将一个或两个变量转换为相同的类型。

    if (u > static_cast<unsigned int>(i)) {
        std::cout << "u is greater than i" << std::endl;
    }
    
  2. 使用相同的数据类型:尽可能使用相同的数据类型进行比较。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,持续学习C++进阶、OpenGL、WebGL知识AI大模型应用实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号搜同学小张 🙏

本站文章一览:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值