OC的BOOL類型:
32-bit下,BOOL被定義為signed char.
64-bit下,BOOL被定義為bool.
BOOL類型有兩個值YES,NO。YES=1,NO=0。
說明:objective-c 中的BOOL 實際上是一種對帶符號的字符類型(signed char)的類型定義(typedef),它使用8位的存儲空間。通過#define指令把YES定義為1,NO定義為0。
注意:objective-c 並不會將BOOL作為僅能保存YES或NO值的真正布爾類型來處理。編譯器仍將BOOL認作8位二進制數,YES 和 NO 值只是在習慣上的一種理解。
問題:如果不小心將一個大於1字節的整型值(比如short或int)賦給一個BOOL變量,那么只有低位字節會用作BOOL值。如果該低位字節剛好為0(比如8960,寫成十六進制為0x2300),BOOL值將會被認作是0,即NO值。而對於bool類型,只有true和false的區別,即0 為false,非0為true。bool類型變量就當變量的值是非0就返回1,等於0就返回0.
舉例:
BOOL b1=8960; // 實際是 NO,因為8960換成十六進制為0x2300,BOOL 只有8位存儲空間,取0x2300的低8位,00,所以是NO
bool b2=8960;//實際是true,因為bool類型,非0即為true。
測試:
BOOL j = 8960;
NSLog(@"j:%d",j);//2015-01-28 22:40:29.935 地址作為參數的函數[3468:251458] j:0
bool m = 8960;
NSLog(@"m:%d",m);//2015-01-28 22:40:29.935 地址作為參數的函數[3468:251458] m:1
相關知識:
①機器字長:是指計算機進行一次整數運算所能處理的二進制數據的位數(整數運算即定點整數運算)。通常也是CPU內部數據通路的寬度。即字長越長,數的表示范圍也越大,精度也越高。機器的字長也會影響機器的運算速度。倘若CPU字長較短,又要運算位數較多的數據,那么需要經過兩次或多次的運算才能完成,這樣勢必影響整機的運行速度。機器字長與主存儲器字長通常是相同的,但也可以不同。不同的情況下,一般是主存儲器字長小於機器字長,例如機器字長是32位,主存儲器字長可以是32位,也可以是16位,當然,兩者都會影響CPU的工作效率。
②在計算機系統中,數值一律用補碼來表示和存儲。
③原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其余位表示數值的大小。表示方式有很多8位二進制原碼等。因此脫離表示方式講一個數的原碼就是耍流氓。另外,補碼的補碼就是原碼。
eg(用8位二進制表示法),5 :0000 0101。 28 :0001 1100。 -13 :1000 1101
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
補碼表示方式很多,有8位二進制補碼表示形式、16位二進制補碼表示形式,以及32位二進制補碼表示形式,64位進制補碼表示形式等。每一種補碼表示形式都只能表示有限的數字。
⑵如果補碼的符號位為“1”,表示是一個負數,那么求給定的這個補碼的補碼就是要求的原碼。
【例】已知一個補碼為11111001,則原碼是10000111(-7)。
於是:
BOOL l = 130; //130的16位二進制原碼是:0000 0000 1000 0010。由於在計算機中,數值是以補碼的形式存儲的。因此要把原碼轉換成補碼。由正數的轉換規則得知其補碼為:0000 0000 1000 0010。用BOOL類型來裝這個數的話。由於BOOL是有符號字符型即只占8位,於是從最后一位起截取8位得到:1000 0010。轉換成原碼並用十進制打印出來就變成了-126. 轉換過程(由於是有符號字符型,因此最高位代表符號位,故最高位保持不變,其余位取反后加1): 1111 1101 + 1 = 1111 1110 -- -126
NSLog(@"l:%d",l);//2015-01-28 22:15:11.249 地址作為參數的函數[3440:242113] l:-126
BOOL k = -130;//1000 0000 1000 0010轉成補碼1111 1111 0111 1110,再截取8位變成0111 1110,由於是有符號的,因此最高位代表符號位,0代表是正數,有規定可知,正數的原碼就是補碼,正數的補碼就是原碼。從而得到其原碼為:0111 1110,轉換成十進制就是126。
NSLog(@"k:%d",k);//2015-01-28 22:15:11.249 地址作為參數的函數[3440:242113] k:126