iOS小知識(shí)(四)-從NSUInteger談起

我們先看一組簡(jiǎn)單的代碼,猜一猜控制臺(tái)會(huì)輸出什么呢?
    NSInteger a = -1;
    NSArray *array = @[@"str"];
    if (a > array.count) {
        NSLog(@"測(cè)試1");
    }else{
        NSLog(@"測(cè)試2");
    }

答案是:

答案.png

控制臺(tái)為輸出 “測(cè)試1”,也就是說(shuō)if里面的判斷,-1>1是成立的,這明顯是反常識(shí)的,為什么if條件會(huì)成立的,我們繼續(xù)往下看。

typedef.png

在CPU為64位情況下(iPhone5s及以后的機(jī)型,均為64位)
NSInteger即為long類(lèi)型 64位下
NSUInteger 即為 unsigned long 類(lèi)型
64位下,long和unsigned long下所占字節(jié)均為8字節(jié)。
首先變量a是NSInteger類(lèi)型,而NSArray的count屬性,我們點(diǎn)進(jìn)去去看,可以看到是NSUInteger類(lèi)型(NSString的length類(lèi)型同為NSUInteger),所以if里面的表達(dá)式本質(zhì)就成為了long 和 unsigned long 進(jìn)行數(shù)值比較。即有符號(hào)和無(wú)符號(hào)數(shù)的比較。
而編譯器在判斷有符號(hào)數(shù)和無(wú)符號(hào)數(shù)進(jìn)行比較時(shí),一律會(huì)將有符號(hào)數(shù)轉(zhuǎn)化為無(wú)符號(hào)數(shù)。即將NSInteger類(lèi)型的值-1轉(zhuǎn)換為NSUInteger類(lèi)型

那么,有符號(hào)數(shù)如何轉(zhuǎn)化為無(wú)符號(hào)數(shù)呢?

在計(jì)算機(jī)內(nèi)存存儲(chǔ)的有符號(hào)數(shù)的最高位變?yōu)閿?shù)據(jù)位,即有符號(hào)數(shù)轉(zhuǎn)為無(wú)符號(hào)數(shù)。

在計(jì)算機(jī)中,數(shù)據(jù)是以補(bǔ)碼的形式存在的。

原碼:正數(shù)的原碼是自己
補(bǔ)碼:除符號(hào)位外,按位取反,然后+1
所以十進(jìn)制的-1轉(zhuǎn)成8個(gè)字節(jié)64位二進(jìn)制后,為
1000 0000 0000 ... 0001 (共64位,首位為符號(hào)位1 表示為負(fù)數(shù))
而實(shí)際上計(jì)算機(jī)存儲(chǔ)的-1是它的補(bǔ)碼 即:
1111 1111 1111 ... 1111
轉(zhuǎn)成無(wú)符號(hào)數(shù)后,最高位的1不在表示符號(hào)位,而表示數(shù)據(jù)位。
64個(gè)1 即(2的64次方-1)
結(jié)果是
18446744073709551615
所以if里面的表達(dá)式-1 在轉(zhuǎn)為無(wú)符號(hào)數(shù)以后,最后變成了:18446744073709551615
所以,就有了開(kāi)頭的那個(gè)結(jié)果。

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

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

  • 數(shù)據(jù)格式詳解 輸入輸出函數(shù)詳解 字符串處理函數(shù)詳解 內(nèi)存函數(shù)詳解 類(lèi)詳解 數(shù)據(jù)格式詳解 2^8=256(同樣是一個(gè)...
    我在東北玩泥巴_閱讀 2,302評(píng)論 0 0
  • 對(duì)于開(kāi)發(fā)者來(lái)說(shuō),像基本數(shù)據(jù)類(lèi)型這種比較基礎(chǔ)的知識(shí)應(yīng)該是不被擔(dān)憂(yōu)的,但是前段時(shí)間檢查項(xiàng)目代碼時(shí)發(fā)現(xiàn)居然有tag越界的...
    不做待宰的猴子閱讀 2,879評(píng)論 0 2
  • 基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換 在Java中,我們經(jīng)常使用到基本數(shù)據(jù)的類(lèi)型轉(zhuǎn)換,類(lèi)型轉(zhuǎn)換用來(lái)將一個(gè)數(shù)值從一種類(lèi)型轉(zhuǎn)換位另一種類(lèi)型...
    Jadyn閱讀 526評(píng)論 0 4
  • 第二章 數(shù)據(jù)類(lèi)型 2.1 常量與變量 2.1.1 關(guān)鍵字 2.1.2 數(shù)據(jù)類(lèi)型 數(shù)據(jù)類(lèi)型的作用:編譯器預(yù)算對(duì)象(變...
    CodeDove閱讀 1,429評(píng)論 0 1
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒(méi)有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,464評(píng)論 0 13

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