Standard C Episode 1
Standard C Episode 1
計(jì)算機(jī)內(nèi)存可以記錄大量的信息,只有記錄在內(nèi)存中的信息才是可以使用的。計(jì)算機(jī)的內(nèi)存管理者是操作系統(tǒng)。程序可以根據(jù)需要向操作系統(tǒng)申請(qǐng)存儲(chǔ)區(qū),所有存儲(chǔ)區(qū)必須先申請(qǐng)并經(jīng)過操作系統(tǒng)分配后才能由程序使用。我們知道計(jì)算機(jī)里的信息可以簡(jiǎn)單劃分為:
?? ??? ??? ??? ?????? /指令
?? ?? /控制信息
信息 -?? ??? ??? ?\控制字
????? \數(shù)據(jù)信息
?? ??? ???? ? ? ? ? |
?? ??? ? ? ? /???? ? ? ? ?? \
???? 數(shù)值信息???? 非數(shù)值信息
????? /??? \?????????? ? ? ? ? ? ?? ? ? /? ? ?? \
?? 定點(diǎn)數(shù)? 浮點(diǎn)數(shù)?? 字符數(shù)據(jù)? 邏輯數(shù)據(jù)
C語言中,可以用變量來代表內(nèi)存中的一個(gè)存儲(chǔ)區(qū),并可以通過變量名來區(qū)分不同存儲(chǔ)區(qū)。源程序中可以通過變量聲明(定義)語句可以向操作系統(tǒng)申請(qǐng)存儲(chǔ)區(qū)。變量名可以代表兩個(gè)不同的東西,一是代表存儲(chǔ)區(qū)本身,二是代表存儲(chǔ)區(qū)里面存放的數(shù)據(jù)。
C語言變量分多種類型(數(shù)據(jù)類型),不同類型變量的數(shù)據(jù)信息在存儲(chǔ)區(qū)是有區(qū)別的,不同類型的變量可以參與的操作也是有區(qū)別的。
?
計(jì)算機(jī)中的內(nèi)存基本存儲(chǔ)單元是字節(jié)byte,最小存儲(chǔ)單元是位bit,8bit組成一個(gè)字節(jié)。每個(gè)字節(jié)可以用來表示256個(gè)數(shù)字。我們之所以對(duì)計(jì)算機(jī)中的數(shù)據(jù)進(jìn)行分組,劃分?jǐn)?shù)據(jù)類型就是因?yàn)椴煌瑪?shù)據(jù)占有存儲(chǔ)空間不一。
字符類型一般占內(nèi)存一個(gè)字節(jié),因此可以通過數(shù)字表示256個(gè)不同的字符,256個(gè)字符各自對(duì)應(yīng)著一個(gè)數(shù)字,這數(shù)字或者介于-127~127或者介于 0-255之間,具體字符所對(duì)應(yīng)的數(shù)字取決于編譯器。但是一般對(duì)于0~127這部分?jǐn)?shù)值和字符的對(duì)應(yīng)關(guān)系都是固定的,都是有共識(shí)的,這就是ASCII碼 表。ASCII碼表規(guī)定了128個(gè)字符對(duì)應(yīng)的數(shù)字。所以我們說ASCII碼表規(guī)定了字符到數(shù)字之間的對(duì)應(yīng)關(guān)系,ASCII碼從0~127.這部分對(duì)應(yīng)沒有 編譯器差異。
在C語言中使用char表示字符類型,該類型的字符和數(shù)字的對(duì)應(yīng)關(guān)系取決于編譯器,但是對(duì)于0~127這部分?jǐn)?shù)字對(duì)應(yīng)的字符是符合ASCII碼規(guī)定的。
在C語言中還有unsigned char,叫做無符號(hào)字符類型。該類型字符和數(shù)字對(duì)應(yīng)關(guān)系式固定的,沒有編譯器差異。當(dāng)然對(duì)于0~127這部分?jǐn)?shù)字對(duì)應(yīng)的字符依然是符合ASCII碼規(guī)定的。
short叫做短整型類型,一般占有2byte,可以表示65535個(gè)數(shù)字。
unsigned short叫做無符號(hào)短整型,一般占有2byte,可以表示65535個(gè)數(shù)字,而且全部是無符號(hào)數(shù),全是正數(shù),數(shù)值范圍是[0,65534]
long叫做長(zhǎng)整型,一般占有4byte
unsigned long叫做無符號(hào)長(zhǎng)整型,一般占有4byte
int叫做整型,一般占有4byte
unsigned int叫做無符號(hào)整型,一般占有4byte
float叫做單精度浮點(diǎn)數(shù)類型,一般占有4byte
double叫做雙精度浮點(diǎn)數(shù)類型,一般占有8byte
long double叫做高精度浮點(diǎn)類型,一般占有12byte
--->以上說的是一般情況,實(shí)際應(yīng)該視計(jì)算機(jī)平臺(tái)而定,例如我的計(jì)算機(jī)lotus-Laptop用sizeof操作符查看結(jié)果如下:
?
數(shù)值信息分定點(diǎn)數(shù)和浮點(diǎn)數(shù)。其中定點(diǎn)數(shù)也稱為整型數(shù),浮點(diǎn)數(shù)也稱為實(shí)型數(shù)。
數(shù)值信息在機(jī)器中的表示:
?? ?數(shù)值信息在機(jī)器內(nèi)的表達(dá)形式稱為"機(jī)器數(shù)",而"機(jī)器數(shù)"代表的數(shù)值稱為此"機(jī)器數(shù)"的真值。("機(jī)器數(shù)"采用的二進(jìn)制編碼方法是補(bǔ)碼表示方法。)
數(shù)值信息在計(jì)算機(jī)內(nèi)采用符號(hào)數(shù)字化處理后,計(jì)算機(jī)就可以識(shí)別和表示數(shù)值信息了,為了改進(jìn)帶符號(hào)數(shù)值的運(yùn)算方法,人們提出了數(shù)值信息的多種二進(jìn)制編碼方法,多種編碼方法其實(shí)質(zhì)都是在對(duì)負(fù)數(shù)的表示進(jìn)行改造,原碼、反碼和補(bǔ)碼就是這樣。
原碼:符號(hào)-絕對(duì)值表示的編碼,稱為原碼。
反碼:正數(shù)的反碼表示與原碼表示一樣。負(fù)數(shù)的反碼的符號(hào)位與原碼相同,其余各位按位取反。
補(bǔ)碼:正數(shù)的補(bǔ)碼表示與原碼表示一樣。負(fù)數(shù)的補(bǔ)碼可由該數(shù)的反碼再加1求得。
--->補(bǔ)碼的好處是:(1)零的表示唯一(2)符號(hào)位可作為數(shù)值參加運(yùn)算
對(duì)于原碼、反碼和補(bǔ)碼我們得出的結(jié)論是:
(1)計(jì)算機(jī)數(shù)值信息的"機(jī)器數(shù)"采用的是補(bǔ)碼,這樣可以簡(jiǎn)化帶符號(hào)數(shù)值的運(yùn)算
(2)正數(shù)的反碼和補(bǔ)碼和原碼相同
(3)負(fù)數(shù)補(bǔ)碼計(jì)算方法可以總結(jié)為對(duì)其相反數(shù)"按位求反再加一",其實(shí)質(zhì)就是對(duì)負(fù)數(shù)的相反數(shù)求相反數(shù)。補(bǔ)碼的補(bǔ)碼就是原碼的相反數(shù)
(4)補(bǔ)碼參與運(yùn)算的結(jié)果依然是補(bǔ)碼
##################################################
附:負(fù)數(shù)補(bǔ)碼計(jì)算方法"按位求反再加1"其實(shí)質(zhì)就是求相反數(shù),以下是簡(jiǎn)明推理過程
以-13機(jī)器數(shù)的推理為例:
-13=?
-13+13=0
******** + 00001101 =? 00000000
******** + 00001101 = 100000000
******** = 100000000 - 00001101
******** =? 11111111 + 1 - 00001101
******** = 11111111 - 00001101 + 1
******** = 11110010 + 1
******** = 11110011
試求-51的機(jī)器碼?
-51=?
-51+51=0
******** + 00110011 =? 00000000
******** + 00110011 = 100000000
******** = 100000000 - 00110011
******** =? 11111111 + 1 - 00110011
******** =? 11111111 - 00110011 + 1
******** =???????????? 11001100 + 1
******** = 11001101
##################################################
?
?
?
?
C語言源程序中向指定存儲(chǔ)區(qū)存放數(shù)據(jù)的操作許多,其中賦值操作符是 = 是最核心的,該操作符可以把右操作數(shù)賦給左操作數(shù),左操作數(shù)應(yīng)該是一個(gè)允許存放數(shù)據(jù)的存儲(chǔ)區(qū)。我們把可以放在賦值操作符左邊的變量成為左值變量,把可以放在賦值操作符右邊的變量稱為右值變量。
ANSI C標(biāo)準(zhǔn)庫標(biāo)準(zhǔn)輸入輸出模型中,不管文本從何處輸入又或向何處輸出都將按照字符流處理,文本流是一個(gè)多行字符組成的字符序列,每一行行末都有一個(gè)換行符。(PS:往往程序可以通過統(tǒng)計(jì)換行符來得到總行數(shù))
C語言源程序中,一個(gè)字符串常量應(yīng)該用雙引號(hào)""括起來才行! 并且,一般地,一個(gè)字符串常量應(yīng)該置于同一行才可以,因?yàn)榫幾g器是不會(huì)主動(dòng)到其他行尋找字符串結(jié)束分隔符"的。 (PS: 當(dāng)然,如果字符串常量被人為分散在多行,應(yīng)該使用續(xù)行符號(hào)\來連接兩行,以方便編譯器認(rèn)定一個(gè)完整的字符串)
?
?
1 /* 2 * printf格式控制字符串中轉(zhuǎn)義字符序列\(zhòng)r練習(xí) 3 * */ 4 5 #include <stdio.h> 6 7 int main() 8 { 9 long int integer = 0; 10 11 for (integer = 1; integer <= 987654321l; integer++) 12 if (integer % 4 ) 13 printf("."); 14 else 15 printf("\r"); 16 17 return 0; 18 }?
1 /* 2 * printf練習(xí) 3 * 轉(zhuǎn)義字符序列 4 * */ 5 6 #include <stdio.h> 7 int main() 8 { 9 printf("\"\"\n");//輸出引號(hào) 10 printf("\\\n");//輸出反斜杠 11 printf("%%\n");//輸出百分號(hào) 12 printf("\a");//輸出一個(gè)蜂鳴聲 13 printf("abc\rxyz\n");//輸出abc后退回再輸出xyz 14 /*printf("\c\n");//編譯會(huì)出warning,提示有無法識(shí)別的轉(zhuǎn)義字符序列.進(jìn)一步如果忽略warning,那么\c整體被忽略(也就是說\c根本就沒有被編譯入機(jī)器碼)*/ 15 16 printf("%x\n", '%'); 17 printf("\x5\n");//格式控制字符串中可以用轉(zhuǎn)義字符序列來實(shí)現(xiàn)通用的字符表達(dá)方式,通過使用轉(zhuǎn)義字符序列代表任意字符 18 19 return 0; 20 }?
1 /* 2 * 3 * scanf練習(xí) 4 * */ 5 6 #include <stdio.h> 7 8 int main() 9 { 10 11 int integer = 0; 12 scanf("%d", &integer); 13 printf("%d\n", integer); 14 15 /* 16 int num = 0; 17 scanf("%d", num);//這樣的調(diào)用scanf()會(huì)引起編譯warning 18 //當(dāng)gcc 02scanf.c -Wall編譯時(shí),編譯器報(bào)warning 19 //如果忽略warning,所生成目標(biāo)代碼執(zhí)行時(shí)候可能引發(fā)操作系統(tǒng)強(qiáng)制終止代碼執(zhí)行, 因?yàn)榇a執(zhí)行至scanf("%d", num)時(shí),將num當(dāng)一個(gè)地址值使用,這樣可能會(huì)引起地址越界 20 printf("%d\n", num); 21 */ 22 23 return 0; 24 }?
1 /* 2 * 打印C各數(shù)據(jù)類型當(dāng)前占有的存儲(chǔ)空間大小(byte) 3 * */ 4 5 #include <stdio.h> 6 int main() 7 { 8 printf("int->%d\n", sizeof(int)); 9 printf("unsigned int->%d\n", sizeof(unsigned int)); 10 printf("unsigned->%d\n", sizeof(unsigned)); 11 printf("short int->%d\n", sizeof(short int)); 12 printf("short->%d\n", sizeof(short)); 13 printf("unsigned short int->%d\n", sizeof(unsigned short int)); 14 printf("unsigned short->%d\n", sizeof(unsigned short)); 15 printf("long int->%d\n", sizeof(long int)); 16 printf("long->%d\n", sizeof(long)); 17 printf("unsigned long int->%d\n", sizeof(unsigned long int)); 18 printf("unsigned long->%d\n", sizeof(unsigned long)); 19 printf("char->%d\n", sizeof(char)); 20 printf("unsigned char->%d\n", sizeof(unsigned char)); 21 printf("float->%d\n", sizeof(float)); 22 printf("double->%d\n", sizeof(double)); 23 printf("long double->%d\n", sizeof(long double)); 24 25 return 0; 26 } 1 /* 2 * sizeof()練習(xí) 3 * */ 4 #include <stdio.h> 5 6 main() 7 { 8 char character = 0; 9 unsigned char character_u = 0; 10 printf("char類型變量character占有%d個(gè)字節(jié)\n", sizeof(character)); 11 printf("unsigned char類型變量character_u占有%d個(gè)字節(jié)\n", sizeof(character_u)); 12 13 /*C語言中我們之所以區(qū)分?jǐn)?shù)據(jù)類型,就是因?yàn)椴煌瑪?shù)據(jù)所占存儲(chǔ)空間大小不一*/ 14 printf("char類型變量占有%d個(gè)字節(jié)\n", sizeof(char)); 15 printf("unsigned char類型變量占有%d個(gè)字節(jié)\n", sizeof(unsigned char)); 16 }?
1 /* 2 * sizeof()練習(xí) 3 * sizeof()只是用來計(jì)算操作數(shù)占有的存儲(chǔ)空間,它不影響操作數(shù)本身.請(qǐng)分析本例 4 * */ 5 #include <stdio.h> 6 7 main() 8 { 9 char character = 0; 10 11 character = 'a'; 12 printf("char類型變量character存放著%c, 占有%d個(gè)字節(jié)\n",character, sizeof(char)); 13 14 sizeof(character = 'b');//sizeof關(guān)鍵字可以對(duì)表達(dá)式的結(jié)果計(jì)算占有存儲(chǔ)空間大小,但是表達(dá)式中的所有修改都不會(huì)保留,所以本例程的兩行打印結(jié)果一樣。 15 printf("char類型變量character存放著%c, 占有%d個(gè)字節(jié)\n",character, sizeof(char)); 16 }?
1 /* 2 * 3 * Discreption:計(jì)算87+97演示溢出的例程 4 * 當(dāng)采用一個(gè)字節(jié)存儲(chǔ)時(shí),87+97會(huì)溢出 5 * */ 6 #include <stdio.h> 7 main() 8 { 9 char c = 87; 10 printf("%d\n", c); 11 c = c + 87;//這里會(huì)溢出 12 printf("%d\n", c); 13 }?
1 /* 2 * 操作符練習(xí) 3 * */ 4 5 #include <stdio.h> 6 main() 7 { 8 int num1 = 0, num2 = 0; 9 10 printf("15 / 7 = %d\n", 15 / 7); 11 printf("15 %% 7 = %d\n", 15 % 7); 12 num1 = num2 = 7; 13 printf("num1是%d, num2是%d\n", num1, num2); 14 num1 += 2;//num = num + 2; 15 printf("num1是%d\n", num1); 16 num1 *= 2 + 3;//復(fù)合賦值操作符的優(yōu)先級(jí)和賦值操作符的優(yōu)先級(jí)一樣,所以語句num *= 2 + 3;等效于語句num = num * (2 + 3); 17 printf("num1是%d\n", num1); 18 19 }?
轉(zhuǎn)載于:https://www.cnblogs.com/libig/p/4100913.html
總結(jié)
以上是生活随笔為你收集整理的Standard C Episode 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:怎样在VMware ESXi上 克隆
- 下一篇: 可编程控制器实训