在閱讀源碼的過(guò)程中碰到了“7<<16”,小白,看不懂,然后去百度,知道這是左移運(yùn)算符,繼續(xù)看下去,發(fā)現(xiàn)小小的運(yùn)算符里,大有學(xué)問(wèn),這里我就不一一贅述了,只是想說(shuō)一些皮毛,以便記憶。在iOS的宏定義里,尤其需要注意運(yùn)算符的優(yōu)先級(jí)順序。附送貓神宏定義黑魔法傳送門。
運(yùn)算符的優(yōu)先級(jí)
指針最優(yōu),單目運(yùn)算優(yōu)于雙目運(yùn)算。如正負(fù)號(hào)。
先算術(shù)運(yùn)算,后移位運(yùn)算,最后位運(yùn)算,邏輯運(yùn)算最后計(jì)算。
(位運(yùn)算符:& ^ | )
請(qǐng)?zhí)貏e注意:
1 << 3 + 2 && 7等價(jià)于 (1 << (3 + 2))&&7.
表達(dá)式
單目運(yùn)算 > 雙目運(yùn)算 > 三目運(yùn)算( a ? b : c)
指針 > 算術(shù)運(yùn)算 > 位移運(yùn)算 > 位運(yùn)算 > 邏輯運(yùn)算
衍生問(wèn)題
從位移運(yùn)算符中衍生出來(lái)的一些問(wèn)題
在計(jì)算機(jī)中,一個(gè)字節(jié)占8bit,也就是說(shuō)一個(gè)字節(jié)占8位(00000000),一個(gè)漢字是2個(gè)字節(jié),也就是占16位。而nsinteger在不同的系統(tǒng)中,占的位數(shù)也不同。(傳送門)
在32位系統(tǒng)中
int 占4個(gè)字節(jié)
long 占4個(gè)字節(jié)
NSInteger 是int的別名,占4個(gè)字節(jié)
long long 占8個(gè)字節(jié)
int32_t 是int的別名,占4個(gè)字節(jié)
int64_t 是long long的別名,占8個(gè)字節(jié)
在64位系統(tǒng)中
int 占4個(gè)字節(jié)
long 占8個(gè)字節(jié)
NSInteger 是long的別名,占8個(gè)字節(jié)
long long 占8個(gè)字節(jié)
int32_t 是int的別名,占4個(gè)字節(jié)
int64_t 是long long的別名,占8個(gè)字節(jié)
由于long和NSInteger的字節(jié)數(shù)變了,在做系統(tǒng)兼容的時(shí)候可能會(huì)導(dǎo)致溢出,所以在兼容32位和64位系統(tǒng),使用int, long long(或者int32_t,int64_t)這樣的數(shù)據(jù)類型比使用NSInteger可靠得多。
貓神獎(jiǎng)勵(lì)
以下是貓神宏定義黑魔法的獎(jiǎng)勵(lì),僅作記錄,以備不時(shí)之需。
#define NSLogRect(rect) NSLog(@"%s x:%.4f, y:%.4f, w:%.4f, h:%.4f", #rect, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)
#define NSLogSize(size) NSLog(@"%s w:%.4f, h:%.4f", #size, size.width, size.height)
#define NSLogPoint(point) NSLog(@"%s x:%.4f, y:%.4f", #point, point.x, point.y)