int、unsigned int和 size_t使用详解

一、基本定义

类型全称/含义本质常见别名
int整型有符号 32 位整数signed int
unsigned int无符号整型只能存正数uint
size_t大小类型(用于内存/数组)typedef 的无符号整型typedef unsigned int/long(依平台)

二、范围与大小(取决于平台)

类型32位系统(常见)64位系统(常见)
int-2,147,483,648 ~ 2,147,483,647同左
unsigned int0 ~ 4,294,967,295同左
size_t0 ~ 4,294,967,2950 ~ 18,446,744,073,709,551,615(64 位)

size_t 的大小依赖于操作系统位宽,因为它用于表示 内存相关的对象大小(数组长度、分配内存大小等)。


三、区别总结

特性intunsigned intsize_t
有无符号有符号无符号无符号
能否为负数✅ 是❌ 否❌ 否
应用场景一般整数不允许负值的计数表示数组索引/内存大小等
类型别名--typedef 由编译器定义
是否跨平台安全⚠️ 不保证⚠️ 不保证✅ 跨平台推荐使用

四、应用场景

场景推荐类型原因
计数器、ID 等不应为负的变量unsigned int防止负数错误
数组索引、内存大小(如 sizeof 返回值)size_t与系统内存模型一致,跨平台
数学算法中需要正负int支持负值处理

五、代码示例

示例 1:数组遍历推荐使用 size_t

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};

    for (size_t i = 0; i < vec.size(); ++i) {
        std::cout << vec[i] << " ";
    }

    return 0;
}

理由:vec.size() 返回值是 size_t,如果你用 int 去比较会产生隐式类型转换警告或溢出风险。


示例 2:unsigned intint 比较错误示例

#include <iostream>

int main() {
    unsigned int a = 1;
    int b = -1;

    if (a > b)  // ⚠️ True! 因为 b 会被转为非常大的 unsigned int
        std::cout << "a > b" << std::endl;
    else
        std::cout << "a <= b" << std::endl;

    return 0;
}

输出是:a > b,这是逻辑错误,因为 -1 被隐式转换为一个超大无符号数!


示例 3:使用 sizeof 正确类型

#include <iostream>

int main() {
    int arr[10];
    size_t size = sizeof(arr) / sizeof(arr[0]);
    std::cout << "Array size: " << size << std::endl;

    return 0;
}

sizeof 运算符返回的是 size_t 类型,因此用 size_t 接收是正确做法。


示例 4:负索引检查用 int 更安全

void access_array(int index) {
    if (index < 0) {
        std::cout << "Invalid index" << std::endl;
        return;
    }

    // ...
}

如果用 unsigned int 定义 index,就无法判断 index < 0,因为它永远不会小于零


六、最佳实践总结

场景推荐类型
一般整数、含负值运算int
不可能为负的计数、循环变量size_t(首选),或 unsigned int
数组长度/索引size_t
内存大小相关(如 mallocsize_t
跨平台、跨架构开发避免直接用 int / unsigned 做比较,尽量统一类型或强制转换

附加:如何避免 signed / unsigned 问题

  1. 避免 int < unsigned int 这种混比(可出错)
  2. 使用 size_t 进行数组操作
  3. 尽量不将 size_tint 做比较,可用 static_cast<size_t>(int_val) 强制类型匹配
  4. 开启 -Wall -Wextra 编译选项捕捉隐式转换警告

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值