iOS小知识(四)-从NSUInteger谈起

我们先看一组简单的代码,猜一猜控制台会输出什么呢?
    NSInteger a = -1;
    NSArray *array = @[@"str"];
    if (a > array.count) {
        NSLog(@"测试1");
    }else{
        NSLog(@"测试2");
    }

答案是:

答案.png

控制台为输出 “测试1”,也就是说if里面的判断,-1>1是成立的,这明显是反常识的,为什么if条件会成立的,我们继续往下看。

typedef.png

在CPU为64位情况下(iPhone5s及以后的机型,均为64位)
NSInteger即为long类型 64位下
NSUInteger 即为 unsigned long 类型
64位下,long和unsigned long下所占字节均为8字节。
首先变量a是NSInteger类型,而NSArray的count属性,我们点进去去看,可以看到是NSUInteger类型(NSString的length类型同为NSUInteger),所以if里面的表达式本质就成为了long 和 unsigned long 进行数值比较。即有符号和无符号数的比较。
而编译器在判断有符号数和无符号数进行比较时,一律会将有符号数转化为无符号数。即将NSInteger类型的值-1转换为NSUInteger类型

那么,有符号数如何转化为无符号数呢?

在计算机内存存储的有符号数的最高位变为数据位,即有符号数转为无符号数。

在计算机中,数据是以补码的形式存在的。

原码:正数的原码是自己
补码:除符号位外,按位取反,然后+1
所以十进制的-1转成8个字节64位二进制后,为
1000 0000 0000 ... 0001 (共64位,首位为符号位1 表示为负数)
而实际上计算机存储的-1是它的补码 即:
1111 1111 1111 ... 1111
转成无符号数后,最高位的1不在表示符号位,而表示数据位。
64个1 即(2的64次方-1)
结果是
18446744073709551615
所以if里面的表达式-1 在转为无符号数以后,最后变成了:18446744073709551615
所以,就有了开头的那个结果。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 数据格式详解 输入输出函数详解 字符串处理函数详解 内存函数详解 类详解 数据格式详解 2^8=256(同样是一个...
    我在东北玩泥巴_阅读 6,579评论 0 0
  • 对于开发者来说,像基本数据类型这种比较基础的知识应该是不被担忧的,但是前段时间检查项目代码时发现居然有tag越界的...
    不做待宰的猴子阅读 7,799评论 0 2
  • 基本数据类型转换 在Java中,我们经常使用到基本数据的类型转换,类型转换用来将一个数值从一种类型转换位另一种类型...
    Jadyn阅读 3,365评论 0 4
  • 第二章 数据类型 2.1 常量与变量 2.1.1 关键字 2.1.2 数据类型 数据类型的作用:编译器预算对象(变...
    CodeDove阅读 5,189评论 0 1
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 9,831评论 0 13

友情链接更多精彩内容