iOS-基本數(shù)據(jù)類型、大小端、電腦位

一、思維導(dǎo)圖

基本數(shù)據(jù)類型思維導(dǎo)圖

二、基本數(shù)據(jù)類型幾個字節(jié)

具體代碼:https://github.com/lionsom/LXInt_NSInt_Test/tree/master

  • 所占字節(jié)
int       = 100               size = 4 byte 
float     = 1.100000          size = 4 byte
double    = 2.200000e+00      size = 8 byte
short int = 200               size = 2 byte
long long = 1233223           size = 8 byte
bool      = 1                 size = 1 byte 
補充
  • 取值范圍
    舉例:int
1Byte = 8bit
int = 4Byte = 32bit = 32個0和1
有符合第一位 0 正 1 負(fù) 
范圍:-2(32-1) ~ 2(32-1)-1      注:最后正數(shù)-1,是因為從0開始。

三、如何知道電腦是多少位的?

3.1、32位、64位是指什么?與操作系統(tǒng)關(guān)系?

  • 32位和64位一般是指CPU的通用寄存器位寬,所以64位的CPU位寬增加一倍
  • 可尋址范圍大大擴展,32位系統(tǒng)支持最大內(nèi)存位4G,64位系統(tǒng)理論支持最大內(nèi)存2^64=18446,744,073,709,551,616,約1600萬TB,相當(dāng)于16EB。(實際還受制于操作系統(tǒng)和主板約束),實際的CPU尤其是這兩年的CPU都是采取兼容設(shè)計的,內(nèi)部總線不到64位,后期的CPU逐漸都會采用標(biāo)準(zhǔn)的64位。
  • 32位系統(tǒng)和64位系統(tǒng)需要安裝支持相應(yīng)系統(tǒng)模式下的操作系統(tǒng)和驅(qū)動軟件,也就是32位只能安裝32位,64位安裝64位的但可兼容32位運算。

3.2、iPhone操作系統(tǒng)是多少位??

  • iPhone5以及5之前都是32位,iPhone5S及以后全面升級64位
  • 測試:使用模擬器進(jìn)行測試
    • iPhone5 環(huán)境下:long == int == 4 Byte
    • iPhone7 環(huán)境下:long == 8 Byte

3.3、區(qū)分方法

  • 區(qū)分32位和64位方法

    利用long 在不同操作系統(tǒng)中所占字節(jié)不同。
    long在32位操作系統(tǒng)中占4Byte
    long在64位操作系統(tǒng)中占8Byte
    
  • 讀取寄存器長度
    具體操作可看:http://m.itdecent.cn/p/2c6bf64887c7

    • iPhone5環(huán)境下:
      如圖可查看到寄存器"eax = 0x000e944c",由于16進(jìn)制中的1位 = 4bit,得出 “ 8位數(shù) * 4bit = 32bit ”

      iPhone5 讀取寄存器

    • iPhone7環(huán)境下:
      同上可以得出結(jié)論 “ 8位數(shù) * 8bit = 64bit ”

      iPhone7 讀取寄存器

四、如何知道電腦大小端模式?

參考文件:http://blog.csdn.net/ce123_zhouwei/article/details/6971544

  • 名詞解釋

    大端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而低子節(jié)數(shù)據(jù)保存在內(nèi)存的高地址中。
    小端模式:是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中。
    
  • 為什么會有大小端模式?

    處理器(例如32位或者64位的cpu)的發(fā)展。
    ARM芯片(iPhone)默認(rèn)采用小端。
    
  • 驗證方式1:(強轉(zhuǎn))

short int a = 0x1122;     // 十進(jìn)制為4386,其中11稱為高子節(jié)(即15~8位)。
char b = ((char *)&a)[0]; // 取變量a的低子節(jié)(即7~0位)
printf("%x", b);          // 輸出22代表編譯器為小端模式
  • 驗證方式2:(便于理解)
int num = 0x12123678;                   // 十進(jìn)制為305419896
char a = num & 0xff;                    // 取(0 ~ 7位)一個子節(jié)
char b = num >> 8 & 0xff;               // 取(8 ~15位)一個子節(jié)
char c = num >> 16 & 0xff;              // 取(16~23位)一個子節(jié)
char d = num >> 24 & 0xff;              // 取(24~31位)一個子節(jié)
printf("%x, %x, %x, %x", a, b, c, d);   // 小端模式將輸出78,56,34,12

五、各類關(guān)系

5.1、int 與 NSinteger 區(qū)別

  • 查看NSInteger的API可以知道:NSInteger是一個封裝,它會識別當(dāng)前操作系統(tǒng)的位數(shù),自動返回最大的類型。


    NSInteger的API

5.2、int 與 long

  • 查到C語言中,int和long的字節(jié)數(shù)是和操作系統(tǒng)指針?biāo)嘉粩?shù)相等。但c語言中說,long的長度永遠(yuǎn)大于或等于int
  • Objective-C里,如下:
在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é)

5.3、float 與 double

  • 在32位、64位中
    • float 占 4Byte
    • double 占 8Byte

5.4、char

  • 在32位、64位中,都只占 1 Byte

本文由Lionsom_lin整合編寫,歡迎關(guān)注!

部分借鑒,如有侵權(quán),請及時通知!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容