標準C語言05 進製轉換 補碼反碼

2021-10-24 21:36:21 字數 4379 閱讀 9152

進製轉換:

為什麼使用二進位制、八進位制、十六進製制:

因為現在的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

01100100

01101101

b的4~7位:b & (0xf<<4) 11110000

b的3~6位:(b<<1) & (0xf<<4) 11110000

a & ~(0xf0) | (b<<1) & (0xf0)

函式: function

一段具有某項功能的**的集合,是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 原碼...