標籤:blog 使用 ar java strong 資料 2014 on log
一、進位知識
(1)預設是十進位。八進位前面加0,即int num1=015;是13。十六進位前面加0x/0X,即int num1=0xd,結果是13。二進位前面是0b/0B,即int num1=0b1101,結果是13。
(2)輸出可以是八進位、十進位、十六進位輸出,分別是%o、%d、%x,但沒有二進位格式直接輸出。
(3)3位二進位位是0~7,三個3位二進位位就相當於八位元據。如000001101(二進位的13),我們劃分成三個一組000 001 101,再分別換算成十進位的就是0 1 5,這個015就是八進位的13。
(4)同上,二進位轉換成十六進位就是4個一組劃分再轉換即可。
(5)重新補腦以下原碼補碼反碼。電腦中儲存的都是補碼。正數的三碼合一。負數三碼各自過。如-13,則原碼是1000 1101(最高位是1表示負數,是0表示正數),反碼就是除了最高位的符號位不變外其餘都取反則變成1111 0010,補碼是在反碼基礎上加1,即加0000 0001,所以補碼是1111 0011。
二、位元運算符
(1)&按位與,只有兩個都是1才返回1,即9&5=1,因為1001&0101=0001,所以是1。所以任何數按位與1,結果還是那個數。
(2)同理,| 按位或。有一個是1就返回1。
(3)異或^,相同返回0(即都是1或者都是0),不同返回1。多個整數按位異或時,順序不影響最終結果。相同整數按位異或結果都是0,所以結果是0。任何整數按位異或上0,結果還是那個整數。
(4)取反~,就是把1變成0,0變成1。
(5)左移<<,9<<1就是把9的二進位位左移1位。往左邊移動多少位,就是等於9*2^(位元),即左移1位結果9*2,左移2位結果是9*4……。但是左移有可能會改變數值的正負性,因為高位被捨棄,低位用0補齊了。使用場合:當需要計算某個數值*2的多少次方時。
(6)同理,右移就是除以2的幾次方。
三、變數儲存細節
(1)記憶體最小單位是位元組,如果是一個int值需要用4個位元組,那麼記憶體配置地址的數值會從大到小分配,數值的最高位放在大地址中,放不下再逐個放在小地址中。並把最終最小的那個地址值作為整個數值的引用地址。
(2)類型修飾符之一改變取值範圍。int是4個位元組、short和long是2個和8個位元組。如果int的值放不下數值,可以用long int=1234567898765L來書寫,這句話意思就是強制改變int的位元組數變成8個位元組,這樣就可以儲存更大的資料。一般我們也會在對應的數值後面加上L或者小寫l。對應的格式化輸出變成%ld,如果是short的話是%hd,是long long的話是%lld。
(3)類型修飾符之二符號。預設是signed,即正、負、0,範圍是-2^(31)~2^(31)。unsigned只能賦值正數和0,取值範圍是0~2^(32)。可以和上面修飾符混合使用。
(4)數組作為形參時候可以不寫具體元素個數,如arr[]。數組的儲存順序和變數相反,從小地址開始放到大地址。
(5)二維數組。int ages[2][3]={{1,2,3},{4,5,6}};
(6)字串本質上類似於字元數組,但是字串儲存最後位有一個\0,讀取遇到\0就結束。strcat()是拼接兩個字串,strcpy(a,b,1)是把b拷貝到a裡面,且只拷貝1個字元。strcmp(a,b,2)是比較兩個字串,相等返回0,前面大於後面返回正數,反之負數。升級版是strncmp(a,b,2),2表示只比較前2位字元。
(7)字串數組相當於二維數組,char a[2][10]={"hhhhhh","kkkkkk"};。
四、指標
(1)指標變數是用*標識的,如int a=5; int *p=&a;p指標就是存放了一個a的地址,而直接使用*p=20;*p相當於訪問p地址裡的記憶體並把值修改為20,也就是此時a的值就是20。
//指標其實就是地址之間的傳來傳去&表示取到這個變數的地址。p指標本身就是地址變數,*p是直接存取這個地址指向的記憶體。//清null 指標用=NULLvoid change(int *p){ *p=80;}int main(int argc, const char * argv[]) { int num1=90; change(&num1); printf("%d\n",num1); return 0;}
(2)**p表示指向指標的指標,如果要訪問值則是**p。
(3)指標變數佔用8個位元組。為什麼要給指標變數定義資料類型int。只是告訴指標在取值時候取多少個位元組。
(4)指標和數組。如果int *p=&arr[0];那麼*p就是數組的第一個值,*(p+1)就是第二個值,類推,此處+1,是加了指標類型變數所佔用的位元組數。
(5)數組名=數組地址,即arr=&arr[0];。
(6)定義一個指向函數的指標:調用是用(*p)();即可。但我們一般直接用p();來調用。
void change(){ printf("jjj");}int main(int argc, const char * argv[]) { //以下兩行是,相當於把函數名換成(*p),然後隨後賦值一下即可 void (*p)(); p=change; return 0;}
(7)可以把函數當做參數進行傳遞,在Java裡稱之為回呼函數。
【Xcode學C-4】進位知識、位元運算符、變數儲存細節以及指標的知識點介紹