計(jì)算機(jī)內(nèi)存存儲(chǔ)數(shù)據(jù)的部位有硬盤和內(nèi)存
硬盤存儲(chǔ)的是可見數(shù)據(jù),內(nèi)存存儲(chǔ)的是不可見數(shù)據(jù)
硬盤,內(nèi)存所存儲(chǔ)的數(shù)據(jù)都是二進(jìn)制數(shù)據(jù)
我們使用的計(jì)算機(jī)室為了實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)棚唆,數(shù)據(jù)運(yùn)算叹誉,數(shù)據(jù)管理
[1]我們(程序員)必須了解數(shù)據(jù)是如何存儲(chǔ)到計(jì)算機(jī)中的
[2]我們(程序員)必須了解,我們?nèi)绾瓮ㄟ^代碼將數(shù)據(jù)存儲(chǔ)到計(jì)算機(jī)中庙曙,以及如何使用這些數(shù)據(jù)
[對(duì)于人類]我們?nèi)祟愅ǔ?duì)于十進(jìn)制數(shù)據(jù)更加熟悉
[對(duì)于計(jì)算機(jī)]計(jì)算機(jī)通常用二進(jìn)制來存儲(chǔ)數(shù)據(jù),因?yàn)槎M(jìn)制對(duì)于計(jì)算機(jī)而言比較容易實(shí)現(xiàn)
內(nèi)存存數(shù)數(shù)據(jù)的基本單元是三極管(導(dǎo)通,截止椭豫,反向擊穿)
計(jì)算機(jī)中表示數(shù)據(jù)的方式有 二進(jìn)制,八進(jìn)制旨指,十進(jìn)制赏酥,十六進(jìn)制
二進(jìn)制:由0和1兩種字符組成,前綴為0b谆构,例子:0b1001
八進(jìn)制:由0~7八種字符組成裸扶,前綴為0,例子:0755
[應(yīng)用:文件權(quán)限]
d rwxr-xr-x=d rwx r-x r-x
= 111 101 101
= 7 5 5
=0755
第一組:文件所有者得權(quán)限
第二組:文件所有者所在小組的其他成員的權(quán)限
第三組:文件所有者的小組之外其他小組的權(quán)限
十進(jìn)制:由0~9十種字符組成
十六進(jìn)制:由09和AF十六種字符組成搬素,前綴為0x呵晨,例子:0x1a,0x799
[應(yīng)用:顏色表示]
顏色的三原色:紅 綠 藍(lán)
#FF0000 —紅色
#00FF00 —綠色
#000000 —黑色
#FFFFFF —白色
[注]八進(jìn)制蔗蹋,十六進(jìn)制的誕生時(shí)為了解決兩個(gè)問題:
(1)二進(jìn)制數(shù)據(jù)本身不是很直觀(無法很容易地看懂)
(2)十進(jìn)制數(shù)據(jù)轉(zhuǎn)成二進(jìn)制數(shù)據(jù)何荚,轉(zhuǎn)換過程必須使用除2法,比較麻煩
1.二進(jìn)制 轉(zhuǎn) 十進(jìn)制
0b10010=0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4
=1 * 2^1 + 1 * 2^4
=18
[注]二進(jìn)制數(shù)據(jù) 從右往左數(shù)猪杭,依次是 第0餐塘,1,2......位
轉(zhuǎn)換方法:二進(jìn)制數(shù)據(jù)的每一位數(shù)值皂吮,乘以2的位數(shù)次方戒傻,然后全部相加得到十進(jìn)制結(jié)果
2.十進(jìn)制 轉(zhuǎn) 二進(jìn)制
18=0b10010
轉(zhuǎn)換方法:除2法,余數(shù)從下往上數(shù)
3.二進(jìn)制 轉(zhuǎn) 八進(jìn)制
0b10010=010 010
= 2 2
=022
轉(zhuǎn)換方法:二進(jìn)制轉(zhuǎn)八進(jìn)制蜂筹,從右往左需纳,每三位一取作為一組,高位不夠補(bǔ)0
4.二進(jìn)制 轉(zhuǎn) 十六進(jìn)制
0b10010=0001 0010 0b111101=0011 1101
= 1 2 = 3 d
=0x12 =0x3d
轉(zhuǎn)換方法:二進(jìn)制轉(zhuǎn)十六進(jìn)制艺挪,從右往左不翩,每四位一取作為一組,高位不夠補(bǔ)0
二進(jìn)制數(shù)據(jù)的三種形態(tài):原碼,反碼口蝠,補(bǔ)碼
任何一個(gè)數(shù)據(jù)存儲(chǔ)到計(jì)算機(jī)中器钟,必須分配有固定大小的內(nèi)存單元
而在計(jì)算機(jī)中,最小的數(shù)據(jù)單元為字節(jié)
1字節(jié) == 8個(gè)二進(jìn)制位
1.原碼
一個(gè)二進(jìn)制數(shù)據(jù)的原碼是由符號(hào)位和數(shù)值位構(gòu)成妙蔗,符號(hào)位占一位傲霸,其他位就是數(shù)值位。符號(hào)位在最高位
正數(shù)的符號(hào)位為0眉反,負(fù)數(shù)的符號(hào)位為1
在確定字節(jié)數(shù)的情況下昙啄,最高位作為符號(hào)位,其他位用來表示數(shù)值的絕對(duì)值大小
例:1字節(jié)3的原碼 0000 0011
1字節(jié)-3的原碼 1000 0011
[結(jié)論] 二進(jìn)制的原碼無法正確運(yùn)算寸五,計(jì)算機(jī)不會(huì)采用原碼來計(jì)算數(shù)據(jù)
2.反碼
在確定字節(jié)數(shù)的情況下梳凛,正數(shù)的反碼和原碼一樣;
? 負(fù)數(shù)的反碼梳杏,符號(hào)位不變伶跷,其他位取反(1變0,0變1)
例:0000 0011 1字節(jié)3的反碼
1111 1100 1字節(jié)-3的反碼
[結(jié)論] 二進(jìn)制的反碼無法正確運(yùn)算秘狞,計(jì)算機(jī)不會(huì)采用反碼來計(jì)算數(shù)據(jù)
3.補(bǔ)碼
正數(shù)的補(bǔ)碼和原碼、反碼一樣蹈集,負(fù)數(shù)的補(bǔ)碼是 反碼加1
例:0000 0011 1字節(jié)的3的補(bǔ)碼
1111 1101 1字節(jié)的-3的補(bǔ)碼
[注]對(duì)補(bǔ)碼再求一次補(bǔ)碼得到原碼
計(jì)算機(jī)中是以二進(jìn)制的形式存儲(chǔ)烁试、計(jì)算數(shù)據(jù)的
[結(jié)論]計(jì)算機(jī)是以二進(jìn)制的補(bǔ)碼形式存儲(chǔ)、計(jì)算數(shù)據(jù)的拢肆,因?yàn)檠a(bǔ)碼可以正確運(yùn)算
4.總結(jié)
八進(jìn)制數(shù)據(jù)前綴為0
十六進(jìn)制數(shù)據(jù)前綴為0x
二進(jìn)制數(shù)據(jù)前綴為0b
打印二進(jìn)制數(shù)據(jù)减响,沒有特定的打印格式!9帧支示!
打印八進(jìn)制數(shù)據(jù),用%o
打印十進(jìn)制數(shù)據(jù)鄙才,用%d
打印十六進(jìn)制數(shù)據(jù)颂鸿,用%x
程序中存在多種數(shù)據(jù),但是數(shù)據(jù)總體上講可以分為兩種:常量數(shù)據(jù) 和 變量數(shù)據(jù)
C語言中的基本數(shù)據(jù)類型有三類:整型攒庵,字符型嘴纺,浮點(diǎn)型(實(shí)型)
整型:關(guān)鍵字為 int,short浓冒,long
[注] 使用整型的關(guān)鍵字可以定義整型變量栽渴,用來存儲(chǔ)整數(shù)
字符型:關(guān)鍵字為 char
[注] 使用字符型的關(guān)鍵字可以定義字符型變量,用來存儲(chǔ)字符常量
浮點(diǎn)型:關(guān)鍵字為 float稳懒,double
[注] 使用浮點(diǎn)型的關(guān)鍵字可以定義浮點(diǎn)型變量闲擦,用來存儲(chǔ)帶小數(shù)點(diǎn)的數(shù)
標(biāo)識(shí)符的命名規(guī)則:
<1>必須由數(shù)字,字母,下劃線中的一種,或多種組成.
<2>不能以數(shù)字開頭.
<3>不能和系統(tǒng)預(yù)定義的關(guān)鍵字重復(fù)
正確表示的標(biāo)識(shí)符可以用來給變量,函數(shù),指針變量,結(jié)構(gòu)體等等命名.
[整型] int,short,long
1.整型變量的定義
int i;//在程序運(yùn)行時(shí),會(huì)向計(jì)算機(jī)申請(qǐng)4個(gè)字節(jié)內(nèi)存單元,這個(gè)內(nèi)存單元的名字就用i表示,使用i就 如果使用分配的4字節(jié)內(nèi)存單元.
short s;//會(huì)向計(jì)算機(jī)申請(qǐng)2個(gè)字節(jié)內(nèi)存單元.
long l;//會(huì)向計(jì)算機(jī)申請(qǐng)8個(gè)字節(jié)內(nèi)存單元.
//使用sizeof(xxx) 可以測(cè)得某個(gè)變量所占內(nèi)存空間大小
printf("%ld\n",sizeof(i));
printf("%ld\n",sizeof(s));
printf("%ld\n",sizeof(l))
2.整型變量的初始化
//初始化,指的是在變量定義的同時(shí)通過賦值號(hào)給變量賦一個(gè)初始值.
// = , 賦值號(hào)
int i5 = 100;
3.整型變量的賦值
//賦值,指的是在變量定義之后,給變量賦一個(gè)新值.
//后賦的值 會(huì)覆蓋掉之前存的值.
i5 = 200;
4.整型變量的輸入/輸出
類型 | 輸入格式 | 輸出格式 |
---|---|---|
int | %d | %d |
short | %hd | %hd |
long | %ld | %ld |
[注] 數(shù)據(jù)輸入使用scanf語句
數(shù)據(jù)輸出使用printf語句
//可以通過scanf語句給變量i賦值,賦的值是通過鍵盤輸入的.
scanf("%d",&i);//& 是取地址符,可以取得變量的地址(內(nèi)存中的地址)
整型變量的數(shù)據(jù)表示范圍:
在程序中使用int墅冷,short纯路,long所定義的變量默認(rèn)是有符號(hào)類型的變量
有符號(hào)整型變量數(shù)據(jù)表示范圍是根據(jù)變量所占內(nèi)存大小而定的
基本整型(int) -2^31 ~ 2^31-1 -21億 ~ 21億
短整型(short) -2^15 ~ 2^15-1
長(zhǎng)整型(long) -2^63 ~ 2^63-1
0111 1111 ~~ 1111 1111 == 2^31-1
1000 0000 ~~ 0000 0000 == -2^31
1111 1111 ~~ 1111 1111 == -1
如果需要在程序中定義無符號(hào)整型變量,需要在int等關(guān)鍵字前加unsigned
unsigned int i俺榆;
無符號(hào) 基本整型(unsigned int) 0~2^32-1
無符號(hào) 短整型(unsigned short) 0~2^16-1
無符號(hào) 長(zhǎng)整型(unsigned long) 0~2^64-1
字符變量
定義字符變量使用char
定義無符號(hào)字符變量使用 unsigned char
定義字符變量是用來存儲(chǔ)字符數(shù)據(jù)的感昼,例如‘a(chǎn)’‘9’‘+’
1.定義一個(gè)字符變量
//定義(有符號(hào))字符變量使用 char
char c;//剛定義出來的字符變量,如果不初始化罐脊,值無法確定
//字符變量 占 1字節(jié)內(nèi)存
printf("%ld\n",sizeof(c));
//有符號(hào)字符變量存儲(chǔ)數(shù)據(jù)范圍:-2^7 ~ 2^7-1
//無符號(hào)字符變量存儲(chǔ)數(shù)據(jù)范圍:0 ~ 255
2.字符變量的初始化
char c1='a';
char c2='+';
3.字符數(shù)據(jù)的輸入/輸出
輸入:
scanf(“%c”定嗓,&c);
輸出:
printf(“%c\n”萍桌,c)宵溅;
浮點(diǎn)型變量
定義浮點(diǎn)型變量可以使用的關(guān)鍵字有:float,double
浮點(diǎn)型變量 用來存儲(chǔ)帶小數(shù)點(diǎn)的數(shù)
1.浮點(diǎn)型變量的定義
//float上炎,double
//float 定義的變量恃逻,稱為“單精度浮點(diǎn)型”變量,可以存儲(chǔ)小數(shù)點(diǎn)后6-8位
//double 定義的變量藕施,稱為“雙精度浮點(diǎn)型”變量寇损,可以存儲(chǔ)小數(shù)點(diǎn)后13-15位
float f;//定義float類型變量,變量f會(huì)占用4字節(jié)內(nèi)存空間
double d;//定義double類型變量裳食,變量d會(huì)占用8字節(jié)內(nèi)存空間
printf("%ld\n",sizeof(f));
printf("%ld\n",sizeof(d));
2.浮點(diǎn)型變量的初始化
float f1=3.14f;
double d1=6.28;
//打印浮點(diǎn)型變量的值
//輸單精度浮點(diǎn)型數(shù)據(jù)矛市,用%f
//輸出雙精度浮點(diǎn)型數(shù)據(jù),用%lf
//%f诲祸,%lf浊吏,默認(rèn)輸出的數(shù)據(jù)都保留小數(shù)點(diǎn)后6位
printf("%f\n",f1);
printf("%lf\n",d1);
3.浮點(diǎn)型變量的賦值
//后賦的值,會(huì)覆蓋之前的值
f1=6.28f;
printf("%f\n",f1);
//我們可以通過 %m.nf 控制輸出格式
//m 救氯,數(shù)據(jù)所占總字符寬度
//n找田,小數(shù)點(diǎn)后保留n位
f1=3.14f;
printf("%.2f\n",f1);
內(nèi)存大小
類型 | 內(nèi)存大小(32) | 內(nèi)存大小(64) |
---|---|---|
int | 4 | 4 |
short | 2 | 2 |
long | 4 | 8 |
char | 1 | 1 |
float | 4 | 4 |
double | 8 | 8 |
數(shù)據(jù)輸入/輸出格式
類型 | 輸入/輸出格式 |
---|---|
int | %d |
short | %hd |
long | %ld |
char | %c |
float | %f |
double | %lf |
unsigned int | %u |
unsigned short | %hu |
unsigned long | %lu |
不同進(jìn)制數(shù)據(jù)—輸入/輸出格式
進(jìn)制 | 格式 |
---|---|
八進(jìn)制 | %o |
十進(jìn)制 | %d |
十六進(jìn)制 | %x |
? [注] %i,可以用來輸出各種進(jìn)制的數(shù)據(jù)
輸入scanf的工作原理
程序開始執(zhí)行后着憨,會(huì)在scanf語句處停下來墩衙,等待用戶輸入數(shù)據(jù),一旦用戶輸入了數(shù)據(jù)甲抖,不管輸入了多少數(shù)據(jù)底桂、什么類型的數(shù)據(jù),通通會(huì)在用戶按下回車鍵時(shí)被寫入到[輸入緩沖區(qū)],然后scanf才從[輸入緩沖區(qū)]中去取對(duì)應(yīng)格式的數(shù)據(jù)
如果當(dāng)scanf語句從[輸入緩沖區(qū)]中取數(shù)據(jù)時(shí)惧眠,如果有scanf語句想要的特定格式的數(shù)據(jù)籽懦,直接讀走數(shù)據(jù),就不會(huì)等待用戶輸入
只有在[輸入緩沖區(qū)]中沒有數(shù)據(jù)氛魁,沒有特定格式的數(shù)據(jù)暮顺,才會(huì)等待用戶輸入
[結(jié)論] scanf讀取數(shù)據(jù)時(shí)厅篓,是首先從[輸入緩沖區(qū)]中取數(shù)據(jù)的
清除[輸入緩沖區(qū)]中的所有字符:
scanf("%*[^\n]");
scanf("%*c");
輸出printf的工作原理
當(dāng)程序執(zhí)行到printf語句時(shí),會(huì)把需要輸出的字符串挨個(gè)寫入到[輸出緩沖區(qū)]捶码,當(dāng)遇到[輸出緩沖區(qū)]刷新條件時(shí)羽氮,才會(huì)把[輸出緩沖區(qū)]中的數(shù)據(jù)顯示到終端輸出
緩沖區(qū)刷新的條件
<1> \n
<2> 程序結(jié)束
<3> 手動(dòng)刷新 fflush(stdout)
<4> 當(dāng)緩沖區(qū)滿 4096字節(jié)(4K)
1字節(jié)==8二進(jìn)制位
1024字節(jié)==1KB
1024KB==1MB
1024MB==1GB
1024GB==1TB