進製轉換:
為什麼使用二進位制、八進位制、十六進製制:
因為現在的cpu只能識別高低兩種電流,只能對二進位制資料進行計算。
二進位制資料雖然可以直接被cpu計算識別,但是不方便書寫、記錄,把二進位制資料轉換為八進位制是為了方便記錄在文件中。
隨著cpu的位數不斷的增加,由早期的8位逐漸發展成了現在的64位,因此八進位制就不能滿足需要了,所以發展出了十六進製制。
由於歷史原因八進位制還不能退出歷史舞台(檔案的許可權 m=4+2+1)
十進位制轉二進位制(其他進製):
求餘法:用2對資料進行求餘,然後用商繼續求餘,直到商為0結束,過程中產生的餘數就是該資料的二進位制(逆序)
127 %2 1
63 %2 1
31 %2 1
15 %2 1
7 %2 1
3 %2 1
1 %2 1
001111111
求權法:資料 - 2^(n-1) 如果可以減,則第n位就是1,否則是0
1 2 4 8 16 32 64 128
手算: 79、63、121、49
練習1:輸入乙個正整數m,顯示該資料的n(n>=2)進製,超過10,則用字母顯示。二進位制轉十進位制:每一位*2^(n-1) 求和
4+8+32+128=172
10101100
二進位制轉八進位制:從低位起每三位二進位制位對應乙個八進位制位
10 101 100
2 5 4
二進位制轉十六進製制:從低位起每四位二進位制位對應乙個十六進製制位
二進位制:1010 1110 0010 1101
十六進製制:a e 2 d
注意:最大值 + 1 = 最小值
在c**中,以0開頭的都是八進位制資料,以0x開頭的都是十六進製制資料
%x 以十六進製制顯示資料
%o 以八進位制顯示資料
%#x、%#o 以對應的進製來顯示資料
原碼、反碼、補碼:
原碼:資料的二進位制
反碼:正數的原碼就是它的反碼。
負數的反碼就是它的原碼,符號位不變,其它位按位取反
補碼:資料在記憶體中儲存的二進位制
正數的原碼就是補碼。
負數的補碼:
1、轉換成原碼
2、把原碼符號位不變,按位求反得到反碼
3、把反碼+1得到補碼
-127 127
11111111 原碼 01111111
10000000 反碼 01111111
10000001 補碼 01111111
補碼轉原碼:
無符號補碼直接轉成原碼,轉成十進位制。
有符號且最高位是1:
1、補碼-1得到反碼
2、反碼的符號位不變,其它位按位求反得到原碼
3、原碼轉換成10進製
補碼:1111111
反碼:1111110
原碼:1000001 -1
位運算子:
a & b:按位相與
0101 1101 0x5d
1001 1001 0x99
--------
00011001 0x19
a | b:按位相或
0101 1101 0x5d
1001 1001 0x99
--------
1101 1101 0xdd
~a:按位求反
0101 1101 0x5d
1010 0010 0xa2
a ^ b:按位異或(不同輸出1,相同輸出0)
0101 1101 0x5d
1001 1001 0x99
--------
1100 0100 0xc4
a << n: 把a的補碼左移n位,左邊的丟棄,右邊補0
01011101 << 4
11010000 0xd0
a >> n:把a的補碼右移n位,右邊的丟棄,左邊補符號位
11011010 >> 4 0xda
練習2:輸入乙個整數,把它的4~7設定為1010,其它位保持不變。n & ~(f<<4) | (0xa<<4)
n & ~(f0) | (0xa0)
uint32_t numy = 0;
scanf("%u",&num);
num = num & ~(0xf<<4) | (0xa<<4);
printf("%u\n",num);
練習3:輸入兩個整數,把a的47位設定為b的36位,其它位不變。 93 a:01011101 50 b:00110010函式: function01100100
01101101
b的4~7位:b & (0xf<<4) 11110000
b的3~6位:(b<<1) & (0xf<<4) 11110000
a & ~(0xf0) | (b<<1) & (0xf0)
一段具有某項功能的**的集合,是c語言管理**的最小單位。
把**封裝成乙個個函式,可以方便管理、呼叫**。
函式的分類:
標準庫函式:
c語言標準委員會為c語言以函式的形式提供的一些基礎的功能,被封裝在libc.so庫中,使用時需要包含標頭檔案,函式名([引數])即可調
用#include
int isalnum(int c);
功能:當c對應的ascii碼表中的字元是數字、字母字元時返回真。
int isalpha(int c);
功能:當c對應的ascii碼表中的字元是字母字元時返回真。
int isdigit(int c);
功能:當c對應的ascii碼表中的字元是數字字元時返回真。
int islower(int c);
功能:當c對應的ascii碼表中的字元是小寫字母時返回真。
int isupper(int c);
功能:當c對應的ascii碼表中的字元是大寫字母時返回真
#include
int abs(int j);
功能:返回j的絕對值
以下函式是被封裝在libm.so庫檔案中:
double pow(double x, double y);
功能:返回x的y次方
double sqrt(double x);
功能:返回x的平方根
double floor(double x);
功能:返回不大於x的最大整數
double ceil(double x);
功能:返回不小於x的最小整數
double fabs(double x);
功能:返回x的絕對值
#include
time_t time(time_t *t);
功能:返回自1970-01-01 00:00:00到當前時間過了多少秒
int system(const char *command);
功能:呼叫系統命令
system(「clear」
void srand(unsigned int seed);
功能:設定隨機種子
int rand(void);
功能:返回乙個隨機數
練習4:獲取10個[100,1001)的隨機數[a,b)
rand()%(b-a)+a
rand()%901+100
練習5:隨機出一組雙色球彩票號碼系統函式:6紅色:1~33,不能重複
1藍色:1~16
是作業系統以函式介面形式提供一些功能,這些功能包括:
記憶體管理、訊號處理、檔案io、檔案管理、程序管理、程序通訊、執行緒管理、執行緒同步、網路通訊
第三方庫函式:
一些開源的或者是收費的第三方庫**。
自定義函式:為了更好地管理**、減少冗餘把**封裝成函式。
函式宣告:函式宣告的目的是為了告訴其他**,函式的呼叫格式
(顯示宣告)
返回值型別 函式名([引數列表]);
1、c語言中的函式名一定要小寫,用下劃線分隔
2、如果不需要引數,建議寫void,不要空著
3、如果不需要返回值寫void
隱式宣告:當呼叫函式時還沒有定義,也沒有宣告,編譯器會猜測函式的格式,引數列表會根據呼叫時提供的資料(實參)猜測,返回值猜測成int型別
函式定義:
返回值型別 函式名([引數列表])
函式呼叫:函式名(實參);
函式呼叫完畢後,返回值會放在呼叫的位置,可以立即顯示,也可以用變數記錄下來
注意:1、不能在函式內定義函式
2、如果函式的定義在呼叫之前,那麼函式宣告可以省略
C基礎進製轉換 補碼反碼以及函式的講解
進製轉換 十進位制轉二進位制 求餘法 用2對資料求餘,然後再對商繼續求餘,直到商為0結束,過程中產生的餘數就是該資料的二進位制 逆序 求權法 資料 2 n 1 如果可以減 第n位就是1,否則是0。二進位制轉十進位制 每位的2 n 1 求和 10101100 128 32 8 4 172 注意 二進位...
C語言原碼 反碼 補碼
原碼 反碼 補碼 計算機的基本儲存單元是位元組 byte 計算的的最小儲存單元是位 bit c語言當中的數被分為有符號數和無符號數 有符號數是 正數 負數 0 無符號數是 0 不帶符號的正數 對於無符號數和有符號數的0和正數,原碼 反碼 補碼一致 對於有符號數,最高位為符號位,0代表 1代表 對於有...
C語言 原碼 反碼 補碼
c語言 原碼 反碼 補碼 本文以12和 12 為例,簡要介紹正數和負數的原碼 反碼 補碼求解過程 注 本文均以c語言中整數int所佔4位元組32位形式來求解!正數原碼 反碼 補碼 1 求解方法 正數的原碼 反碼 補碼!2 例子 求解12的原碼 反碼和補碼?解 12對應的二進位制形式為 1100 原碼...