一、數據的儲存
1.整型數據——占兩個字節,范圍[-32768 , 32768]
(1)原碼:正數的符號用0,負數的符號用1,其余各位表示數值的絕對值。
(2)反碼:正數為本身;負數,數值部分每位求反,符號位不變。
(3)補碼:正數為本身,負數為其反碼+1(計算機中以補碼的表示數值)。
——總結:正數的原碼,反碼,補碼相等
負數的反碼為原碼取反(符號位不變),補碼為反碼+1
2.實型數據 的存儲方式:符號位+階碼+尾數。例如:- 1.23e +02
3.字符型數據 ——每個字符占用一個字節,存儲ASCII碼
二、基本數據類型
1.整型與整型常數
(1)整型變量分類 ——無符號(unsign)/有符號、長短
(2)整型常量 表達式
①十進制,②八進制,③十六進制(0x / 0X + 0~9,a~f / A~F)
(3)整數類型
①long型常數:123L/123l ②unsigned型常數:123U /123u ③unsigned long 型常數:123LU / 123lu
Tip:比長整型數還大的數要用實數表示。
2.字符型
(1)字符型常量:'a','0'(注意:單引號)
(2)ASCII字符集(256個)
——整型變量與字符變量的定義和賦值可以互換(在ASCII碼的范圍內)
(3)轉義字符
3.實型
(1)數據長度:
單精度浮點型 —— float ——32位
雙精度浮點型 —— double ——64位
(2)數據精度 不等於 取值范圍
Tip:①不是所有的實數都能在計算機中精確表示;
②實型常量(浮點數)的類型都是 double
(3)實數的表示——浮點表示法(0.123)/ 科學計數法(1.2e-5)
三、數據的輸入與輸出
1.整型數據的輸入與輸出
(1)格式
(2)指定整型數據的輸出寬度:例如:%md,%5d(數據寬度為5)// 如果實際輸出數小於寬度,用空格補上。
例題:
scanf("%o%d",&a,&b); printf("%d %5d",a,b);
輸入:17 17
輸出:15 17
2.實型數據
(1)輸出:float與double :都以%f(小數形式輸出且保留6位小數),%e(指數形式即小數點前有且僅有一位非零數字)
(2)輸入:
①float:使用%f,%e
②double:使用%lf,%le(多一個限定詞 l(long))
(3)控制輸出格式:例如:%5.3f——輸出寬度為5,小數部分 3 位,小數點 1 位
3.字符型
(1)使用scanf()和printf():格式控制說明為%c
(2)使用getchar()與putchar():每次僅輸入輸出一個字符
例題:
代碼:
#include <stdio.h> int main () { char ch; ch = getchar(); while(ch!='#'){ if(ch>='A'&&ch<='Z'){ ch=ch-'A'+'a'; }else if(ch>='a'&&ch<='z'){ ch=ch-'a'+'A'; } putchar(ch); ch = getchar(); } return 0; }
解析:'m' - 'a' + 'A'='M' ——ASCII中‘a'與’A‘為任意一個字母小寫與大寫間的數據差。
4.類型轉換:(只是為了本次運算而進行的臨時性轉換)
(1)自動類型轉換:參與運算量的類型不同,則先轉換成同一類型,然后進行運算。
(2)強制類型轉換:轉換的是運算符,不是函數,例如 強制轉換應寫成(int)x,而不是int(x)
四、表達式
1.算術表達式
(1)優先級
(2)結合方向:單目為從右向左,雙目為從左向右。
(3)注意:
① / :整數除整數得整數,且不會四舍五入,直接舍去小數部分。
負整數結果的四舍五入沒有規定,所以結果不確定。
如果要精確的結果,可以把一個操作數轉換為浮點數 。
②% :針對整型數據
負數%沒有規定符號
(4)++,--
①++i,--i :i=i+1;取i值為++n的值
②i++;i-- :取 i 值為表達式i++的值,再來 i=i+1
2.賦值表達式
3.關系表達式
4.邏輯表達式
(1) 優先級與結合方向:!(最高,右結合) && || (左結合)
(2)!a:如果a為真,!a為0()假,!a的值永遠為0或1。
5.條件表達式:exp1?exp2:exp3——先判斷exp1,真(非0)執行exp2,反之。
6.逗號表達式:從左向右,以最后一個為表達式的值
7.位運算
(1)運算符:
① ~ 按位取反 ②& 按位與(不同為0,同1為1,同0為0) ③^ 按位異或:相同取0,不同取1
④ | 按位或 ⑤移位運算符 << 左移,>>右移 (空出位置用0填補)
(2)操作數只為整型或字符型的數據以及其變體,運算時先將數據轉化為二進制。
(3)異或的特殊操作:
①a^a=0 ②a^~a=二進制全是1 ③ ~(a~^a)=0
周結問題
1.以鍵盤輸入^Z或遇到文件結束符時結束數據輸入 的題型:
——輸入停止以不等於EOF為標志 (不確定循環次數用while)
——用scanf()!=EOF 或者getchar()即可不用再調用輸入函數
2.換行問題:
有些題會要求行末不能有多余換行,但是多個樣例之間需要,這時候我們一般都是特判:如果不是最后一組樣例,就輸出換行,是最后一組就不換行。
\\如果無法確認最后一組,則判斷第一組前面沒有\n,后面每組前面都輸出\n。即:除了最后一個樣例結尾不換行,其他結尾都換行<=>除了第一個樣例開始前不換行,其他都換行。
3.負數的二進制:取反用 ! ,而不用~ ——因為~是按位取反,先轉化為二進制取反,再轉化為十進制,使得輸出不再是二進制。
4.輸出二進制:用數組從0->32儲存,再從32->0的輸出,從而正確輸出二進制。
例如:
for(i=0;i<=32;i++)
{ a[i]=1; a[i]=n%2; n=n/2; if(n==0) break; }
for(i=31;i>=0;i--) { printf("%d",a[i]); if(i==8||i==16||i==24||i==32) }