1、c語言基礎
經典入門「hello world!」
*原始檔:hello.c
*標頭檔案:用#include包含
*關鍵字:關鍵字,32個關鍵字。main是主函式,程式執行入口。return是函式結束的標誌。
*符號:#號是c語言的一種符號,%取餘符號 ,++、–、&、|、~、!、;(一句**的結束標誌)。
注釋://注釋一行**的,多行的語句就用/…*/注釋。
*變數:是變化的,在計算過程中會發生變化的量。
*函式:函式小括號裡面引數列表,緊跟一對花括號,話括號裡面是函式體。
步驟:
編輯、編譯、執行、除錯
**:
#include
int main(void)
資料型別:整形(long int, short), 浮點型, 字元型。
負數、隱式轉換
位元組:所有的系統裡面,乙個位元組佔8bit。整形佔4個位元組32位。
long佔8位元組,int佔4位元組,short佔2位元組,char佔1位元組。
背景知識:c語言順序結構、選擇結構、迴圈結構
程式中會逐條判斷直到一條符合條件的語句。
注意:if + else之間不能有別的語句 。
if 可以單獨使用,else或else if必須之前的語句必須有if,而且緊跟if 之後。
例:當a>5時輸出1,a<5時輸出0,等於5時輸出5。
#include
int main(void)
else
if (a=5)
else
return
0; }
(1)、for(初始條件(賦值表示式); 終止條件(關係表示式); 迴圈增量(賦值))
for 和條件判斷的結合
注意:括號的問題
(2)、while先執行終止的條件判斷,再執行迴圈體,迴圈體內包含迴圈增量(先判斷後執行)
(3)、do while 先執行迴圈體,迴圈體包含迴圈增量,在進行判斷(先執行後判斷)
例: 用do while執行當a<10時自增:
#include
int main(void)
while(a<10);
printf("%d\n",a);
return
0; }
① 位與&
(1)注意:位與符號是乙個&,兩個&&是邏輯與。
(2)真值表:1&0=0 1&1=1 0&0=0 0&1=0
(3)從真值表可以看出:位與操作的特點是,只有1和1位於結果為1,其餘全是0.
(4)位與和邏輯與的區別:位與時兩個運算元是按照二進位制位彼次對應位相與的,邏輯與是兩個運算元作為整體來相與的。(舉例:0xaa&0xf0=0xa0, 0xaa && 0xf0=1)
② 位或|
(1)注意:位或符號是乙個|,兩個||是邏輯或。
(2)真值表:1|0=1 1|1=1 0|0=0 0|1=1
(3)從真值表可以看出:位或操作的特點是:只有2個0相位或才能得到0,只要有1個1結果就一定是1.
(4)位或和邏輯或的區別:位或時兩個運算元是按照二進位制位彼次對應位相與的,邏輯或是兩個運算元作為整體來相或的。
③ 位取反~
(1)注意:c語言中位取反是~,c語言中的邏輯取反是!
(2)按位取反是將運算元的二進位制位逐個按位取反(1變成0,0變成1);而邏輯取反是真(在c語言中只要不是0的任何數都是真)變成假(在c語言中只有0表示假)、假變成真。
任何非0的數被按邏輯取反再取反就會得到1;
任何非0的數被按位取反再取反就會得到他自己;
④位異或^
(1)位異或真值表:1^1=0 0^0=0 1^0=1 0^1=1
(2)位異或的特點:2個數如果相等結果為0,不等結果為1。記憶方法:異或就是相異就或操作起來。
⑤ 左移位<<,右移位》
c語言的移位要取決於資料型別。
對於無符號數,左移時右側補0(相當於邏輯移位)
對於無符號數,右移時左側補0(相當於邏輯移位)
對於有符號數,左移時右側補0(叫算術移位,相當於邏輯移位)
對於有符號數,右移時左側補符號位(如果正數就補0,負數就補1,叫算術移位)
嵌入式中研究的移位,以及使用的移位都是無符號數。
①暫存器操作的要求(特定位改變而不影響其他位)
(1)arm是記憶體與io統一編址的,arm中有很多內部外設,soc中cpu通過向這些內部外設的暫存器寫入一些特定的值來操控這個內部外設,進而操控硬體動作。所以可以說:讀寫暫存器就是操控硬體。
(2)暫存器的特點是按位進行規劃和使用。但是暫存器的讀寫卻是整體32位一起進行的(也就是說你只想修改bit5~bit7是不行的,必須整體32bit全部寫入)
(3)暫存器操作要求就是:在設定特定位時不能影響其他位。
(4)如何做到?答案是:讀-改-寫三部曲。讀改寫的操作理念,就是:當我想改變乙個暫存器中某些特定位時,我不會直接去給他寫,我會先讀出暫存器整體原來的值,然後在這個基礎上修改我想要修改的特定位,再將修改後的值整體寫入暫存器。這樣達到的效果是:在不影響其他位原來值的情況下,我關心的位的值已經被修改了。
②特定位清零用&
(1)回顧上節講的位與操作的特點:(任何數,其實就是1或者0)與1位與無變化,與0位與變成0
(2)如果希望將乙個暫存器的某些特定位變成0而不影響其他位,可以構造乙個合適的1和0組成的數和這個暫存器原來的值進行位與操作,就可以將特定位清零。
(3)舉例:假設原來32位暫存器中的值為:0xaaaaaaaa,我們希望將bit8~bit15清零而其他位不變,可以將這個數與0xffff00ff進行位與即可。
③特定位置1用|
(1)回顧上節講的位或操作的特點:任何數,其實就是1或者0)與1位或變成1,與0位或無變化
(2)操作手法和剛才講的位與是類似的。我們要構造這樣乙個數:要置1的特定位為1,其他位為0,然後將這個數與原來的數進行位或即可。
④特定位取反用^
(1)回顧上節講的位異或操作的特點:(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化
(2)操作手法和剛才講的位與是類似的。我們要構造這樣乙個數:要取反的特定位為1,其他位為0,然後將這個數與原來的數進行位異或即可。
①暫存器位操作經常需要特定位給特定值
(1)從上節可知,對暫存器特定位進行置1或者清0或者取反,關鍵性的難點在於要事先構建乙個特別的數,這個數和原來的值進行位與、位或、位異或等操作,即可達到我們對暫存器操作的要求。
(2)解法1:用工具軟體或者計算器或者自己大腦計算,直接給出完整的32位特定數。
優勢:可以完成工作,難度也不大,操作起來也不是太麻煩。
劣勢:依賴工具,而且不直觀,讀程式的人不容易理解。
評價:凑活能用,但是不好用,應該被更好用的方法替代。
(2)解法2:自己寫**用位操作符號(主要是移位和位取反)來構建這個特定的二進位制數
②使用移位獲取特定位為1的二進位制數
(1)最簡單的就是用移位來獲取乙個特定位為1的二進位制數。譬如我們需要乙個bit3~bit7為1(隱含意思就是其他位全部為0)的二進位制數,可以這樣:(0x1f<<3)
(2)更難一點的要求:獲取bit3~bit7為1,同時bit23~bit25為1,其餘位為0的數:((0x1f<<3) | (7<<23))
③再結合位取反獲取特定位為0的二進位制數
(1)這次我們要獲取bit4~bit10為0,其餘位全部為1的數。怎麼做?
(2)利用上面講的方法就可以:(0xf<<0)|(0x1fffff<<11)
但是問題是:連續為1的位數太多了,這個數字本身就很難構造,所以這種方法的優勢損失掉了。
(3)這種特定位(比較少)為0而其餘位(大部分)為1的數,不適合用很多個連續1左移的方式來構造,適合左移加位取反的方式來構造。
(2)思路是:先試圖構造出這個數的位相反數,再取反得到這個數。(譬如本例中要構造的數bit4~bit10為0其餘位為1,那我們就先構造乙個bit4~bit10為1,其餘位為0的數,然後對這個數按位取反即可)
C語言基礎一
命令語句都是在蘋果終端下使用的。編譯 cc c hello.c 把源 變成二進位制檔案 目標檔案 cc one.o two.o three.o 預設生成可執行檔案a.out cc o task one.o 生成可執行檔案task 執行 1 在終端輸入 a.out 2 雙擊a.out檔案,選擇用終端執...
c語言基礎(一)
雙精度和單精度 數字後帶f的是單精度float,不帶的是雙精度double,單精度儲存的範圍是雙精度的倍數,兩種都屬於浮點型,當整數部分位數太多時候,小數部分很可能被遺失。ascii碼中0 31和127是不可以在鍵盤中輸入的。除了轉義字元 字元常量 a 單引號包含乙個 x和兩個16進製制數 任何0 ...
C語言基礎 一
一 語言的發展 1 機器語言 特點 a.或稱為二進位制 語言,計算機可以直接識別,不需要做任何翻譯.b.是第一代的計算機語言.c.使用時難記憶難操作編寫出來的程式全是由0和1的數字組成,直觀性差,難以閱讀,不僅難學,難記難檢查,又缺乏通用性.2.十進位制轉為二進位制 將十進位制除以2的餘數寫出來 直...