int 与 unsigned int (uint) 比较时出现的问题

本文探讨了Objective-C中NSMutableArray的计数问题。通过实例解释了当int类型的变量与NSUInteger类型的值进行比较时可能出现的问题,并提供了正确的循环遍历方法。

      今天遇到一个问题 ,简单描述如下

    int   index = -1;

    NSMutableArray *arr = [NSMutableArray array];

    [arr addObject:@"a"];

    [arr addObject:@"b"];

NSLog(@"%d",[arr count]);

    

    if (index>[arr count]) {

NSLog(@"所谓不可能的事出现了");

}else if (index==[arr count]) 

{

        NSLog(@"这不可能");

    }

else {        

    NSLog(@"应该如此啊");

}

我们可以看到 index = -1,[arr count] = 2 , 执行结果却打印的是 :所谓不可能的事出现了 


思考下。。。。


[arr count] 返回的是  NSUInteger   也就是  unsigned int  (uint)  类型 ,

当 int 与  unsigned int  (uint) 比较时,   unsigned int  (uint)  向 int 转化,  -1转成4294967295  那么在判断时  就出现了所谓的 -1>2 

而 NSUInteger   也就是  unsigned int  (uint)   向 int 转化时却不会有问题  因此 NSLog(@"%d",[arr count]);  打印出来的是2


备忘: 

   在使用 [NSarray count]  时要时刻谨记 返回的值是 NSUInteger   也就是  unsigned int  (uint)  类型 。

所以下列的循环应该这么写

    for (int i=-1; i<(int)[arr count]; i++) {

        NSLog(@"%d",i);

    }



### unsigned int uint16_t 的区别 在 C 语言中,`unsigned int` `uint16_t` 是两种同的数据类型,尽管它们都表示无符号整数,但它们的定义、范围用途存在显著差异。 #### 1. 定义标准化 - `unsigned int` 是一种基本的数据类型,其大小取决于编译器目标平台。根据 C 标准,`unsigned int` 至少占用 16 位(2 字节),但在大多数现代系统上,它通常占用 32 位(4 字节)[^1]。 - `uint16_t` 是标准头文件 `<stdint.h>` 中定义的一种精确宽度整数类型,明确表示一个无符号的 16 位整数。它的定义如下: ```c typedef unsigned short uint16_t; ``` 这种定义确保了 `uint16_t` 在所有支持 C99 或更高版本的平台上始终占用 16 位(2 字节)[^1]。 #### 2. 数据范围 - 对于 `unsigned int`,由于其大小依赖于平台,因此其范围也有所同。例如,在 32 位系统上,`unsigned int` 的范围是 0 到 4,294,967,295(即 \(2^{32} - 1\))。而在 16 位系统上,其范围可能是 0 到 65,535(即 \(2^{16} - 1\))。 - 对于 `uint16_t`,其范围始终固定为 0 到 65,535(即 \(2^{16} - 1\)),无论运行在何种平台上,这使得它非常适合需要精确位宽的应用场景[^2]。 #### 3. 可移植性 - 使用 `unsigned int` ,程序的行为可能因平台而异,因为其大小是固定的。这种确定性可能导致代码在同系统上的表现一致。 - 使用 `uint16_t` 可以提高代码的可移植性一致性,因为它明确指定了 16 位宽度,消除了平台相关的大小差异[^2]。 #### 4. 使用场景 - 当需要严格控制整数的位宽,可以使用 `unsigned int`,例如在通用计算或简单的计数操作中。 - 当需要处理特定位宽的数据(如网络协议、文件格式或硬件寄存器),推荐使用 `uint16_t`,以确保跨平台的一致性[^2]。 ### 示例代码 以下是一个简单的示例,展示了两者的差异: ```c #include <stdio.h> #include <stdint.h> #include <limits.h> int main() { unsigned int ui = UINT_MAX; // 平台相关,通常是 32 位 uint16_t u16 = UINT16_MAX; // 始终是 16 位 printf("Size of unsigned int: %zu bytes\n", sizeof(unsigned int)); printf("Range of unsigned int: 0 to %u\n", ui); printf("Size of uint16_t: %zu bytes\n", sizeof(uint16_t)); printf("Range of uint16_t: 0 to %u\n", u16); return 0; } ``` 运行结果可能如下(假设系统为 32 位): ``` Size of unsigned int: 4 bytes Range of unsigned int: 0 to 4294967295 Size of uint16_t: 2 bytes Range of uint16_t: 0 to 65535 ``` ### 结论 `unsigned int` `uint16_t` 的主要区别在于其定义是否依赖于平台以及是否具有固定的位宽。`unsigned int` 更灵活但缺乏可移植性,而 `uint16_t` 提供了严格的位宽控制,适合需要精确数据表示的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值