C語言內存分析ide
1、進制函數
概念:進制是一種計數方式,是數值的表現形式spa
4種主要的進制:code
①. 十進制:0~9 blog
②. 二進制:0和1內存
③. 八進制:0~7ci
④. 十六進制:0~9+a b c d e f字符串
C語言在默認的狀況下爲十進制。編譯器
Int num=1010;//十進制it
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 ,在內存中以字節爲單位進行存儲。
2、內存分析
注意:內存尋址,由大到小。
Int a=1;
Int b=2;
3、類型說明符
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類型的最高位,沒必要用來做爲符號位。
4、位運算
(一)按位與 &
功能:只有對應的兩個二進制位均爲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)使用位運算交換兩個變量的值
#include<stdio.h>
int main()
{
int a=10;
int b=11;
printf("a=%d,b=%d\n",a,b);
a=a^b;
b=a^b;
a=a^b;
printf("a=%d,b=%d\n",a,b);
return 0;
}
(2)使用位&運算符判斷變量的奇偶性
#include<stdio.h>
int main()
{
printf("請輸入須要判斷的整數:\n");
int n;
scanf("%d",&n);
/*
if(n%2==0)
printf("這個數是偶數\n");
else
printf("這個數是奇數\n");
*/
if((n&1)==1)
printf("這個數是奇數\n");
else if((n&1)==0)
printf("這個數是偶數\n");
return 0;
}
(3)編寫一個函數,輸出整數的二進制格式
#include<stdio.h>
void putbinary(int number);
int main()
{
printf("這個程序的做用是把你輸入的整數以二進制的格式輸出\n");
printf("請輸入一個整數:\n");
int n;
scanf("%d",&n);
putbinary(n);
return 0;
}
void putbinary(int number)
{
//int count=sizeof(number)*8-1;
int count=(sizeof(number)<<3)-1;//注意這裏須要註明優先級
printf("%d\n",count);
while(count>=0)
{
int value=(number>>count)&1;
printf("%d",value);
//每四個數字,打印一個空格
if(count%4==0)
printf(" ");
count--;
}
}
5、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。
幫助:輸出一個\,使用\\,輸出一個單引號使用\’,輸出一個雙引號,使用\"。
練習:編寫一個函數,將小寫字母轉換爲大寫。
#include<stdio.h>
char upper(char c)
{
if(c>='a'&&c<='z')
return c-('a'-'A');
else
return c;
}
int main()
{
char a=upper('b');
printf("%c\n",a);
return 0;
}