C語言內存分析


 

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 }
View Code

(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 }
View Code

 

(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  
View Code

 

五、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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM