NSInteger與int凶掰、long的區(qū)別和聯(lián)系

  • 內(nèi)置類型的發(fā)展

C語言開始時只有char(8位)和int(16位)兩種,后來隨著發(fā)展又加入了short(16位)和long(32位)寄摆,此時谅辣,int可以是16位或者32位,依賴于平臺和后續(xù)的兼容性婶恼。再后來當64位出現(xiàn)時桑阶,long long(64位)又被添加進來,為了進行規(guī)范勾邦,對較小的一些類型的范圍就有了一些調(diào)整蚣录,逐漸穩(wěn)定為int32位,long可以有多種定義眷篇,可以是32位萎河,也可以是64位。

  • 在C語言中蕉饼,double公壤、long、unsigned椎椰、int、char類型數(shù)據(jù)所占字節(jié)數(shù)

和機器字長及編譯器有關(guān)系沾鳄,所以慨飘,int、long int译荞、short int的寬度都可能隨編譯器而異瓤的。

但有幾條鐵定的原則(ANSI/ISO制訂的):

1. sizeof(short int)<=sizeof(int) 
2. sizeof(int)<=sizeof(long int) 
3. short int至少應為16位(2字節(jié)) 
4. long int至少應為32位(4字節(jié))

unsigned 是無符號的意思

例如:
16位編譯器
char :1個字節(jié)
char*(即指針變量): 2個字節(jié)
short int : 2個字節(jié)
int: 2個字節(jié)
unsigned int : 2個字節(jié)
float: 4個字節(jié)
double: 8個字節(jié)
long: 4個字節(jié)
long long: 8個字節(jié)
unsigned long: 4個字節(jié)

32位編譯器

char :1個字節(jié)
char*(即指針變量): 4個字節(jié)(32位的尋址空間是2^32, 即32個bit,也就是4個字節(jié)吞歼。同理64位編譯器)
short int : 2個字節(jié)
int: 4個字節(jié)
unsigned int : 4個字節(jié)
float: 4個字節(jié)
double: 8個字節(jié)
long: 4個字節(jié)
long long: 8個字節(jié)
unsigned long: 4個字節(jié)

64位編譯器
char :1個字節(jié)
char*(即指針變量): 8個字節(jié)
short int : 2個字節(jié)
int: 4個字節(jié)
unsigned int : 4個字節(jié)
float: 4個字節(jié)
double: 8個字節(jié)
long: 8個字節(jié)
long long: 8個字節(jié)
unsigned long: 8個字節(jié)

  • NSInteger& NSUInteger

#import <objc/NSObjCRuntime.h>源碼中對NSInteger和NSUInteger的定義如下:

/*  NSObjCRuntime.h
    Copyright (c) 1994-2012, Apple Inc. All rights reserved.
*/

#ifndef _OBJC_NSOBJCRUNTIME_H_
#define _OBJC_NSOBJCRUNTIME_H_

#include <TargetConditionals.h>
#include <objc/objc.h>

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

#define NSIntegerMax    LONG_MAX
#define NSIntegerMin    LONG_MIN
#define NSUIntegerMax   ULONG_MAX

#define NSINTEGER_DEFINED 1

#ifndef NS_DESIGNATED_INITIALIZER
#if __has_attribute(objc_designated_initializer)
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
#else
#define NS_DESIGNATED_INITIALIZER
#endif
#endif

#endif

原來在蘋果的api實現(xiàn)中圈膏,NSInteger是一個封裝,它會識別當前操作系統(tǒng)的位數(shù)篙骡,自動返回最大的類型稽坤。
32位系統(tǒng)中NSInteger為int;64位系統(tǒng)中NSInteger為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.
  • 取值范圍
//32bit
unsigned int 0~4294967295 
int -2147483648~2147483647 
unsigned long 和int一樣
long 和int一樣
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
//64bit
unsigned int 0~4294967295 
int -2147483648~2147483647 
unsigned long 和 unsigned long long一樣
long 和long long一樣
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
  • 在32位系統(tǒng)中

int 占4個字節(jié)
long 占4個字節(jié)
NSInteger 是int的別名尿褪,占4個字節(jié)
long long 占8個字節(jié)
int32_t 是int的別名,占4個字節(jié)
int64_t 是long long的別名得湘,占8個字節(jié)

  • 在64位系統(tǒng)中

int 占4個字節(jié)
long 占8個字節(jié)
NSInteger 是long的別名杖玲,占8個字節(jié)
long long 占8個字節(jié)
int32_t 是int的別名,占4個字節(jié)
int64_t 是long long的別名淘正,占8個字節(jié)

  • 使用注意??

objective-c里摆马,蘋果的官方文檔中總是推薦用NSInteger或者是NSUInteger臼闻,這樣就不用考慮設(shè)備是32位還是64位了。

NSUInteger是無符號的囤采,即沒有負數(shù),NSInteger是有符號的述呐,所以NSUInteger類型不能給它賦負值。

比如以下這段代碼斑唬,a=-1的時候,是能進入循環(huán)的市埋。

//64-bit system
NSUInteger a = -1; 
for(int i=0;i<a;i++){    
    NSLog(@"%d,%lu",i,(unsigned long)a);
    break;
}

輸出:0,18446744073709551615
這時a的值其實等于18446744073709551615(64位系統(tǒng)中)

還有NSUInteger和NSInteger和int都是基礎(chǔ)類型恕刘,是不能放入NSArray中的缤谎,需要轉(zhuǎn)換成NSNumber,應為NSNumber是類褐着,NSArray中只能放入類坷澡。

NSNumber是NSValue的一個子類,它是一個對象來存儲數(shù)字值包括bool型

1. 提供了一系列的方法來存儲char a signed or unsigned char, short int, int, long int, long long int, float, or double or as a BOOL
2. 它提供了一個compare:方法來決定兩個NSNumber對象的排序含蓉;

用以下NSNumber的類方法轉(zhuǎn)即可

(NSNumber *) numberWithChar: (char) value;
(NSNumber *) numberWithInt: (int) value;
(NSNumber *) numberWithFloat: (float) value;
(NSNumber *) numberWithBool: (BOOL) value;

或者使用@簡寫

@()代表NSNumber對象
@""代表NSString對象
@[]代表NSArray對象
@{}代表NSDictionary對象

將基本類型數(shù)據(jù)封裝到NSNumber中后频敛,就可以通過下面的實例方法重新獲取它:

- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
- (NSString *)stringValue;

由于long和NSInteger的字節(jié)數(shù)變了,所以在兼容的時候可能會導致溢出

對于一個11位的整數(shù)馅扣,它在64位系統(tǒng)中使用NSInteger或者long類型斟赚,是可以正常存儲的;如果是在32位系統(tǒng)中差油,它就溢出了拗军!

所以要保證某些較大的整數(shù)可以正常使用的話,就需要使用long long或者int64_t這樣的類型

另外在類型轉(zhuǎn)換的時候
例如 int64_t轉(zhuǎn)換成NSInteger蓄喇,在64位系統(tǒng)中是正常的
但在32位系統(tǒng)中就可能會導致溢出

參考:
int和NSInteger和long區(qū)別
iOS下int long longlong的取值范圍
iOS int long NSInteger 入門與兼容問題講解发侵,讓你秒懂
為什么long和int都是4字節(jié)
在C語言中,double妆偏、long刃鳄、unsigned、int钱骂、char類型數(shù)據(jù)所占字節(jié)數(shù)
iOS7----64位與32位 對比 數(shù)據(jù)類型
iOS-NSNumber對象介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叔锐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子见秽,更是在濱河造成了極大的恐慌掌腰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件张吉,死亡現(xiàn)場離奇詭異齿梁,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門勺择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來创南,“玉大人,你說我怎么就攤上這事省核「逭蓿” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵气忠,是天一觀的道長邻储。 經(jīng)常有香客問我,道長旧噪,這世上最難降的妖魔是什么吨娜? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮淘钟,結(jié)果婚禮上宦赠,老公的妹妹穿的比我還像新娘。我一直安慰自己米母,他們只是感情好勾扭,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铁瞒,像睡著了一般妙色。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慧耍,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天燎斩,我揣著相機與錄音,去河邊找鬼蜂绎。 笑死,一個胖子當著我的面吹牛笋鄙,可吹牛的內(nèi)容都是我干的师枣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼萧落,長吁一口氣:“原來是場噩夢啊……” “哼践美!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起找岖,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陨倡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后许布,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兴革,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杂曲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庶艾。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖擎勘,靈堂內(nèi)的尸體忽然破棺而出咱揍,到底是詐尸還是另有隱情,我是刑警寧澤棚饵,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布煤裙,位于F島的核電站,受9級特大地震影響噪漾,放射性物質(zhì)發(fā)生泄漏硼砰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一怪与、第九天 我趴在偏房一處隱蔽的房頂上張望夺刑。 院中可真熱鬧,春花似錦分别、人聲如沸遍愿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沼填。三九已至,卻和暖如春括授,著一層夾襖步出監(jiān)牢的瞬間坞笙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工荚虚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薛夜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓版述,卻偏偏與公主長得像梯澜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渴析,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,004評論 6 13
  • C語言標準是這樣規(guī)定的:int最少16位(2字節(jié))晚伙,long不能比int短,short不能比int長俭茧,具體位長由編...
    孤舟行客閱讀 2,710評論 0 1
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉咆疗,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,725評論 0 9
  • 旅游是獲得愉悅感和浪漫性的最好媒介∧刚——卡麥隆·麥金托什 他不愛笑午磁。 周三再次和劉焱一同回家,在與劉媽媽進行交流之...
    俊貳閱讀 232評論 0 0