iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别!

在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int、unsigned int。我们知道iOS也可以使用g++编译器,那么它们之间是否有什么联系呢?

从NSUInteger和NSInteger的定义文件中 NSObjCRuntime.h发现有这样的语句:

1 #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
2 typedef long NSInteger;
3 typedef unsigned long NSUInteger;
4 #else
5 typedef int NSInteger;
6 typedef unsigned int NSUInteger;
7 #endif

因此,下面的代码可用改为:

int pvNums = [[[NSUserDefaults standardUserDefaults] objectForKey:@"pvlimit"] integerValue];

修改为:

NSInteger pvNums  = [[[NSUserDefaults standardUserDefaults] objectForKey:@"pvlimit"] integerValue];

这里可以清楚的看出NSInteger和int,NSUInteger和unsigned int之间的区别。mac的OS X系统即为__LP64__,而后面则是指具体的目标硬件设备。所以NSInteger/NSUIteger与对应的int/unsigned int不是完全相等的,与对应的long/unsigned long也不是完全相等的。而是要看具体的运行环境及其硬件设备架构。

为了更好的了解上面的定义,可以参考下面说的:

You usually want to use NSInteger when you don‘t know what kind of processor architecture your code might run on, so you may for some reason want the largest possible int type, which on 32 bit systems is just an int, while on a 64-bit system it‘s a long.

当你不知道程序运行哪种处理器架构时,你最好使用NSInteger,因为在有可能int在32位系统中只是int类型,而在64位系统,int可能变是long型。

I‘d stick with using NSInteger instead of int/long unless you specifically require them.

除非不得不使用int/long型,坚持使用NSInteger。

从上面的定义可以看出NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,有可能是long类型。

With regard to the correct format specifier you should use for each of these types, see the String Programming Guide‘s section on Platform Dependencies

为了正确的使用这些类型,可以参考String Programming Guide‘s section on Platform Dependencies。

为了更简单的知道NSInteger和long的大小,我们只需要记住它们的大小总是等于指针的大小,即在32bit系统中是32bit,在64bit系统大小总是64bit。(NSInteger and long are always pointer-sized. That means they‘re 32-bits on 32-bit systems, and 64 bits on 64-bit systems.)

总结:

int : 当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NSInteger ,因为这样就不用考虑设备是32位还是64位了。(在32位系统里面NSInterger等价于int,在64位系统里面NSInterger等价于long)

NSUInteger是无符号的,即没有负数,NSInteger是有符号的。

NSInteger是基础类型,NSNumber是一个类,如果需要存储一个数值,直接使用NSInteger是不行的,比如在一个数组里使用下面的语句就会报错:

1 NSArray *array = [NSArray alloc] init];
2 [array addObject:3];

因为array里应该是一个类,但‘3’不是,所以需要用NSNumber:

1 NSArray *array = [NSArray alloc] init];
2 [array addObject:[NSNumber numberWithInt:3]];

写的比较简单,希望有帮助。

时间: 2024-08-29 16:21:50

iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别!的相关文章

[转]iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别

在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int.unsigned int.我们知道iOS也可以使用g++编译器,那么它们之间是否有什么联系呢? 从NSUInteger和NSInteger的定义文件中 NSObjCRuntime.h发现有这样的语句: #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUI

iOS开发之int,NSInteger,NSUInteger,NSNumber的使用

1.首先先了解下NSNumber类型: 苹果官方文档地址:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short

OC成长之路 <一> 位运算符、枚举、(原码,补码,反码)、以及NSInteger,NSUInteger,int的区别

引言: 咳咳,首先我是一枚资深小白(资深小白- -.也太衰),这个博客是自己用来记录迷糊犯二的东西. 最近发现难道是因为老了么(我明明18....),很多东西,脑子已经不记得了,迷迷糊糊,概念理论的东西脑子里面七零八落. 从一个知识点跳到另一个知识点,简直是连环事故. ??sad. 傲娇的我不服,决心要认认真真做好笔记,记录期间遇见的种种. 生活要有仪式感,学习应该也是要这样,作为Chapter 1 ,应该要起个好名字. 想了几十分钟,还是随便一些吧. 那就叫: OC成长之路 okok,来开始今

int、 NSInteger、 NSUInteger、NSNumber之间的区别和联系

int. NSInteger. NSUInteger.NSNumber之间的区别和联系 int : 当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NSInteger ,因为这样就不用考虑设备是32位还是64位了. NSUInteger是无符号的,即没有负数,NSInteger是有符号的. NSInteger是基础类型,NSNumber是一个类,如果需要存储一个数值,直接使用NSInteger是不行的,比如在一个数组里使用下面的语句就会报错: NS

(转载)深入解析unsigned int 和 int

就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是默认有符号的.2.unsigned-----无符号,修饰int .char3.long------长型,修饰int .double4.short------短型,修饰int 我们主要来看一下signed和unsigned与int之间的联系与区别.什么叫做有符号,什么叫做无符号这个问题其实很简单,比如

unsigned int与int相加问题

作者 : 卿笃军 一道unsigned int与int类型的相加题目,引发了我对这个问题的思考. 首先要明白两个问题: 问题一. unsigned int 和 int到底哪个能表达出来的数上限大呢? 答:当然是unsigned int. 为什么? 答:因为,int将最高位看做是符号位,0表示'正',1表示'负',也就是说,最高位不能用来存值. 问题二. 当计算机进行两数相加的时候会如何进行类型转换呢? 答:当然是将上限小的转化为上限大的咯.(就是将int类型转化为unsigned int类型).

解决warning: format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘int *’

[[email protected] c]# gcc MemTest.c -o MemTest1 -WallMemTest.c: In function 'main':MemTest.c:24: warning: format '%x' expects type 'unsigned int', but argument 2 has type 'int *'MemTest.c:39: warning: format '%x' expects type 'unsigned int', but arg

char,short ,int ,long,long long,unsigned long long数据范围

速查表: char -128 ~ +127 (1 Byte)short -32767 ~ + 32768 (2 Bytes)unsigned short 0 ~ 65535 (2 Bytes)int -2147483648 ~ +2147483647 (4 Bytes)unsigned int 0 ~ 4294967295 (4 Bytes)long == intlong long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)doub

unsigned int与int相加

int main() { int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//这句话被打印 else printf("a+b<0\n"); int z = a+b; if(z > 0) printf("z>0"); else printf("z<0");//这句话被打印 } 当int和unsigned in相加时,要