C語言內存分析
一、進制
概念:進制是一種計數方式,是數值的表現形式
4種主要的進制:
①. 十進制:0~9
②. 二進制:0和1
③. 八進制:0~7
④. 十六進制:0~9+a b c d e f
C語言在默認的情況下為十進制。
Int num=1010;//十進制
Int num=0b1100;//二進制,以0b或者是0B開頭
Int num=014;//八進制,以0開頭
Int num=0x4;//十六進制,以0x開頭
占位符:
%d和%i :一十進制整數的形式輸出一個值
%o :以不帶符號的八進制輸出
%x :以不帶符號的十六進制輸出
%u :以不帶符號的十進制輸出
%c : 輸出字符
%p : 輸出地址
%f : 輸出小數
%s : 輸出字符串
N位二進制的取值范圍:
2位···0~3 0~2的2次方-1
3位···0~7 0~2的3次方-1
N位··· 0~2的n次方-1
判斷以下數據是否正確:
0x7h4 0986 .089 0b325 10e8.7 96f -.003
類型的取值:
在64位編譯器下,int類型 占4個字節 共4x8=32bit char類型 占1個字節 共1x8=8bit ,在內存中以字節為單位進行存儲。
二、內存分析
注意:內存尋址,由大到小。
Int a=1;
Int b=2;
三、類型說明符
Short== Short int %d 2
Long ==long int %ld 8
Long long ==Long long int %lld 8
Signed ==Signed int==int %d 4(有符號)
Unsigned ==Unsigned int %u 4(無符號)
Signed和unsigned的區別在於最高位要不要拿來作為符號位,顯然后者的取值范圍更大。這兩個說明符可和long等說明符組合使用,但不會改變字節數。Unsigned代表int類型的最高位,不必用來作為符號位。
四、位運算
(一)按位與 &
功能:只有對應的兩個二進制位均為1時,結果才為1,否則為0。
示例:9&5 的結果為1
1001
0101
——
0001
說明:如果位與上1則保留原值,與上0則為0。
應用:查詢0101 0111 0000的倒數第六位是0還是1,則可以與上數值以判斷,得出的結果是什么,那么它的原值就是什么。
0101 0111 0000
0000 0010 0000
0000 0010 0000
(二)按位或 |
功能:只要對應的兩個二進制位有一個為1則結果為1,否則為0。
舉例:9|5的結果為13
1001
0101
——
1101
(三)按位異或 ^
功能:當對應的兩個二進制位不相等時,結果為1,否則為0。
舉例:9^5的結果為:12
1001
0101
——
1100
規律:
①. 相同整數異或的結果為0,如5^5=0
②. 順序可以交換。如9^5^9=9^9^5=0^5=5
③. 任何數值跟0進行異或,結果還是原來的數值。9^0=9
④. a^b^a==b
(四)按位取反 ~
舉例:~9的結果為-10
0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
(五)左移 <<
如a<<n
把整數a的二進制位全部左移n位,高位丟棄,低位補零。左移n位的結果其實是乘以2的n次方,由於符號位會被丟棄,所以結果可能會改變正負性。
舉例:9<<1的結果為18
0000 1001
0010 0010
應用:如果某個數需要乘以2的n次方,那么使用位運算效率更高。
(六)右移 >>
如a>>n
把整數a的二進制位全部右移n位,低位丟棄,符號位不變,一般情況下高位用符號位補齊。右移的結果實際上是除以2的n次方。
(七)練習
(1)使用位運算交換兩個變量的值

1 #include<stdio.h>
2
3 int main() 4
5 { 6
7 int a=10; 8
9 int b=11; 10
11 printf("a=%d,b=%d\n",a,b); 12
13 a=a^b; 14
15 b=a^b; 16
17 a=a^b; 18
19 printf("a=%d,b=%d\n",a,b); 20
21 return 0; 22
23 }
(2)使用位&運算符判斷變量的奇偶性

1 #include<stdio.h>
2
3 int main() 4
5 { 6
7 printf("請輸入需要判斷的整數:\n"); 8
9 int n; 10
11 scanf("%d",&n); 12
13 /*
14
15 if(n%2==0) 16
17 printf("這個數是偶數\n"); 18
19 else 20
21 printf("這個數是奇數\n"); 22
23 */
24
25 if((n&1)==1) 26
27 printf("這個數是奇數\n"); 28
29 else if((n&1)==0) 30
31 printf("這個數是偶數\n"); 32
33 return 0; 34
35 }
(3)編寫一個函數,輸出整數的二進制格式

1 #include<stdio.h>
2
3 void putbinary(int number); 4
5 int main() 6
7 { 8
9 printf("這個程序的作用是把你輸入的整數以二進制的格式輸出\n"); 10
11 printf("請輸入一個整數:\n"); 12
13 int n; 14
15 scanf("%d",&n); 16
17 putbinary(n); 18
19 return 0; 20
21 } 22
23
24
25 void putbinary(int number) 26
27 { 28
29 //int count=sizeof(number)*8-1;
30
31 int count=(sizeof(number)<<3)-1;//注意這里需要注明優先級
32
33 printf("%d\n",count); 34
35
36
37 while(count>=0) 38
39 { 40
41 int value=(number>>count)&1; 42
43 printf("%d",value); 44
45 //每四個數字,打印一個空格
46
47 if(count%4==0) 48
49 printf(" "); 50
51 count--; 52
53 } 54
55
56
57 } 58
59
五、char類型
(一)基礎
Char c=‘A’;
字符在內存中也是也二進制的格式存儲的。
Int num=6;//在內存中以00···0110存儲
Char num=‘6’;//對應的ascii碼值是54=32+16+4+2,在內存中為11 0110
兩者之間有着本質的區別,一個是具體的整數值,一個是字符,以ASCII格式存儲。
(二)使用注意
單引號只能括住單字節的字符,ASCII中的所有字符都是單字節的。
Char c=’男’;//錯誤,因為一個漢字占據3個字節的存儲空間
Char c=”A”;//錯誤,這是字符串,為‘A’+‘\0’。
Char c=65;//正確,另一種形式而已
Char類型占據一個字節,所以它的取值范圍為-128~127。
幫助:輸出一個\,使用\\,輸出一個單引號使用\’,輸出一個雙引號,使用\"。
練習:編寫一個函數,將小寫字母轉換為大寫。

1 #include<stdio.h> 2 3 4 5 char upper(char c) 6 7 { 8 9 if(c>='a'&&c<='z') 10 11 return c-('a'-'A'); 12 13 else 14 15 return c; 16 17 } 18 19 int main() 20 21 { 22 23 char a=upper('b'); 24 25 printf("%c\n",a); 26 27 return 0; 28 29 }