1.進(jìn)制的基本概念
A.什么是進(jìn)制?
進(jìn)制數(shù)一種計(jì)數(shù)的方式,數(shù)值的表現(xiàn)形式
B.常見的進(jìn)制有哪些?
十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制
C.進(jìn)制書寫的格式和規(guī)律?
十進(jìn)制: 0、1、2、3、4、5、6、7、8、9 逢十進(jìn)1
二進(jìn)制: 0、1 逢二進(jìn)1;
書寫形式:需要以0b或者0B開頭,例如:0b101
八進(jìn)制:0、1、2、3、4、5、6、7 逢八進(jìn)一
書寫形式:在前面加個(gè)0,例如:061
十六進(jìn)制:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六進(jìn)一
書寫形式:在前面加個(gè)0x或者0X,例如:0x45
2. 不同進(jìn)制表示與輸出
//
// Created by billge on 2022/12/2.
//
/**
* 不同進(jìn)制表示與輸出
*/
#include <stdio.h>
int main() {
/**
* 1.在C語言中如何告訴編譯器,當(dāng)前編寫的數(shù)值是多少進(jìn)制的?
* 默認(rèn)情況下,所有編寫的數(shù)值都是十進(jìn)制的
*
* 如果想在C語言中表示一個(gè)數(shù)值是八進(jìn)制的,那么必須在前面加上0
* 如果想在C語言中表示一個(gè)數(shù)值是十六進(jìn)制的,那么必須在前面加上0x
* 如果想在C語言中表示一個(gè)數(shù)值是二進(jìn)制的,那么必須在前面加上0b
*
*
* 2.在C語言中如何以不同的進(jìn)制來輸出某一個(gè)數(shù)值
* %i/%d以十進(jìn)制的形式輸出數(shù)值
* %o 以八進(jìn)制的形式輸出數(shù)值
* %x 以十六進(jìn)制的形式輸出數(shù)值
* 注意點(diǎn):
* 在c語言中沒有提供以二進(jìn)制輸出的占位符
*/
int num_1 = 12;//默認(rèn)情況就是十進(jìn)制
printf("num1 = %i\n", num_1);//%i/%d是以十進(jìn)制的形式輸出數(shù)值 num1 = 12
printf("num1 = %o\n", num_1);//14
printf("num1 = %x\n", num_1);//c
int num_2 = 014;//以0開頭就是八進(jìn)制
printf("num2= %d\n",num_2); //num2 = 12
int num_3 = 0xc;//以0x開頭的是十六進(jìn)制
printf("num3= %d\n",num_3); //num3 = 12
int num_4 = 0b1100;//以0b開頭的是二進(jìn)制
printf("num4= %d\n",num_4); //num3 = 12
return 0;
}
3.進(jìn)制轉(zhuǎn)換
//
// Created by billge on 2022/12/2.
//
/**
* 進(jìn)制的轉(zhuǎn)換
*/
#include <stdio.h>
int main() {
/**
* 1.十進(jìn)制轉(zhuǎn)二進(jìn)制
* 規(guī)律:除以2倒序取余
*
* 14
* 2
*-----
* 7 0
* 2
*-----
* 3 1
* 2
*-----
* 1 1
* 2
*------
* 0 1
*=======================
* 倒序:1110
*
*
*
*/
int num = 0b1110;
printf("num=%d\n", num); //num=14
/**
* 2.二進(jìn)制轉(zhuǎn)十進(jìn)制
* 規(guī)律:系數(shù) × 基數(shù)(索引)
* 系數(shù):二進(jìn)制中每一位對(duì)應(yīng)的值就是系數(shù)
* 基數(shù):從二進(jìn)制轉(zhuǎn)到十進(jìn)制的基數(shù)就是2
* 從八進(jìn)制轉(zhuǎn)到十進(jìn)制的基數(shù)就是8
* 索引:從二進(jìn)制的最低位開始,從0開始遞增的數(shù)就是索引
*
* 1110
*
* 1*2(3) + 1*2(2) + 1*2(1) + 0*2(0)
* =8+4+2+0 = 14
*
*
*/
int num_2 = 0b1110;
printf("num2=%d\n", num_2); //num2=14
/**
* 3.十進(jìn)制轉(zhuǎn)八進(jìn)制
* 規(guī)律:除以8倒序取余
* 4.十進(jìn)制轉(zhuǎn)十六進(jìn)制
*/
/**
* 十進(jìn)制轉(zhuǎn)八進(jìn)制
* 24
* 8
*----
* 3 0
* 8
*----
* 0 3
* ==============
* 倒序:30
*
*/
int num_3 = 030;
printf("num_3=%d\n", num_3);//num_3=24
/**
* 十進(jìn)制轉(zhuǎn)十六進(jìn)制
*
* 24
* 16
*----
* 1 8
* 16
*----
* 0 1
*=============
* 倒序:18
*
*/
int num_4 = 0x18;
printf("num_4=%d\n", num_4);//num_4=24
/**
* 5.八進(jìn)制轉(zhuǎn)十進(jìn)制
* 規(guī)律:系數(shù) × 基數(shù)(索引)
* 系數(shù):八進(jìn)制中每一位對(duì)應(yīng)的值就是系數(shù)
* 基數(shù):從八進(jìn)制轉(zhuǎn)到十進(jìn)制的基數(shù)就是8
* 索引:從八進(jìn)制的最低位開始,從0開始遞增的數(shù)就是索引
*
* 030
* 0*8(2) + 3*8(1) + 0*8(0)
* = 0 + 24 + 0 = 24
*
*
*/
/**
* 6.十六進(jìn)制轉(zhuǎn)十進(jìn)制
* 規(guī)律:系數(shù) × 基數(shù)(索引)
* 系數(shù):十六進(jìn)制中每一位對(duì)應(yīng)的值就是系數(shù)
* 基數(shù):從十六進(jìn)制轉(zhuǎn)到十進(jìn)制的基數(shù)就是16
* 索引:從十六進(jìn)制的最低位開始,從0開始遞增的數(shù)就是索引
*
* 0x18
*
* 1*16(1) + 8*16(0) = 16 + 8 = 24
*
*/
/**
* 7.二進(jìn)制轉(zhuǎn)八進(jìn)制
* 規(guī)律:三個(gè)二進(jìn)制位就是一個(gè)八進(jìn)制位
* 案例:01101101
*
* 111 = 7
* 1*2(2) + 1*2(1) + 1*2(0) = 7
* 因?yàn)?11代表的數(shù)值就是7,而八進(jìn)制的每一位最大的值是7
* 所以三個(gè)二進(jìn)制位代表一個(gè)八進(jìn)制位
* 01101101舉例拆分為三個(gè)一組,如果不夠則補(bǔ)0,如下:
* 001 101 101
* 1 5 5
*
*/
int num_5 = 0155;
printf("num_5=%d\n", num_5);//num_5=109
int num_6 = 0b01101101;
printf("num_6=%d\n", num_6);//num_6=109
/**
* 7.二進(jìn)制轉(zhuǎn)十六進(jìn)制
* 規(guī)律:四個(gè)個(gè)二進(jìn)制位就是一個(gè)十六進(jìn)制位
* 案例:01101101
*
* 1111 = 15
* 1*2(3) + 1*2(2) + 1*2(1) + 1*2(0) = 15
* 因?yàn)?111代表的數(shù)值就是15,而十六進(jìn)制的每一位最大的值是15
* 所以四個(gè)二進(jìn)制位代表一個(gè)十六進(jìn)制位
* 01101101舉例拆分為四個(gè)一組,如果不夠則補(bǔ)0,如下:
* 0110 1101
* 6 13(D)====>因?yàn)槭M(jìn)制是0123456789ABCDEF
*
*/
int num_7 = 0x6D;
printf("num_7=%d\n", num_7);//num_7=109
int num_8 = 0b01101101;
printf("num_8=%d\n", num_8);//num_8=109
return 0;
}
4.原碼/反碼/補(bǔ)碼
//
// Created by billge on 2022/12/2.
//
#include <stdio.h>
/**
*
* 原碼,反碼 和 補(bǔ)碼
*
*/
int main() {
/**
* 1.二進(jìn)制在內(nèi)存中的不同表現(xiàn)形式
* 原碼/反碼/補(bǔ)碼
*
* 2.正數(shù)的原碼/反碼/補(bǔ)碼
* 9--->int類型--->占用4個(gè)字節(jié)--->1個(gè)字節(jié)是8位--->總共占用32位
* 0000 0000 0000 0000 0000 0000 0000 1001
* 對(duì)于正數(shù)來說 ,原碼/反碼/補(bǔ)碼 三碼合一
* 正數(shù)的原碼/反碼/補(bǔ)碼都是它的二進(jìn)制
*
* 3.負(fù)數(shù)的原碼/反碼/補(bǔ)碼
* -9--->int 類型--->占用4個(gè)字節(jié)--->1個(gè)字節(jié)是8位--->總共占用32位
* 1000 0000 0000 0000 0000 0000 0000 1001
*
* 二進(jìn)制的最高位我們稱之位符號(hào)位,如果是0,代表是一個(gè)正數(shù),如果是1,代表是一個(gè)負(fù)數(shù)
* 3.1負(fù)數(shù)的原碼就是負(fù)數(shù)的二進(jìn)制
* 3.2負(fù)數(shù)的反碼就是負(fù)數(shù)的二進(jìn)制除了最高位以外,按位取反
* 1000 0000 0000 0000 0000 0000 0000 1001
* 最高位不變,其它位1變成0,0變成1
* 1111 1111 1111 1111 1111 1111 1111 0110
* 3.3負(fù)數(shù)的補(bǔ)碼就是負(fù)數(shù)的反碼加個(gè)1
* 1111 1111 1111 1111 1111 1111 1111 0110
* +0000 0000 0000 0000 0000 0000 0000 0001
* -----------------------------------------
* 1111 1111 1111 1111 1111 1111 1111 0111
*
*/
/**
* 1.計(jì)算機(jī)為什么要有原碼/反碼/補(bǔ)碼
* 計(jì)算機(jī)只能做加法運(yùn)算
* 1+1 ---> 1+1
* 1-1 ---> 1 + (-1)
* 3*3 ---> 3 + 3+ 3
* 9/3 ---> 9 + (-3) + (-3) + (-3)
*
* 需求:要求計(jì)算 1 - 1的結(jié)果
* //先用1的原碼和-1的原碼進(jìn)行計(jì)算
* 0000 0000 0000 0000 0000 0000 0000 0001 1的原碼
* 1000 0000 0000 0000 0000 0000 0000 0001 -1的原碼
* -------------------------------------------------
* 1000 0000 0000 0000 0000 0000 0000 0010 -2原碼
*
* //先用1的反碼和-1的反碼進(jìn)行計(jì)算
* 0000 0000 0000 0000 0000 0000 0000 0001 1的反碼
* 1111 1111 1111 1111 1111 1111 1111 1110 -1的反碼
*----------------------------------------------------
* 1111 1111 1111 1111 1111 1111 1111 1111 反碼
* 1000 0000 0000 0000 0000 0000 0000 0000 -0原碼
*
*
* //先用1的補(bǔ)碼和-1的補(bǔ)碼進(jìn)行計(jì)算
* 0000 0000 0000 0000 0000 0000 0000 0001 1的補(bǔ)碼
* 1111 1111 1111 1111 1111 1111 1111 1111 -1的補(bǔ)碼
* ----------------------------------------------------
* 10000 0000 0000 0000 0000 0000 0000 0000
* 0000 0000 0000 0000 0000 0000 0000 0000(最高位被丟棄) 結(jié)果就是0
*
* 總結(jié):原碼/反碼/補(bǔ)碼 為了保證計(jì)算結(jié)果正確
*
*
*/
/**
* 1.在計(jì)算機(jī)中存儲(chǔ)的所有數(shù)據(jù)都是補(bǔ)碼
* 2.在計(jì)算機(jī)參與運(yùn)算的都是補(bǔ)碼
* 3.如果計(jì)算的結(jié)果是一個(gè)正數(shù),那么直接將計(jì)算的結(jié)果轉(zhuǎn)換為十進(jìn)制就是我們想要的結(jié)果
* 如果計(jì)算的結(jié)果是一個(gè)負(fù)數(shù),那么直接將計(jì)算的結(jié)果先轉(zhuǎn)換為原碼,然后再轉(zhuǎn)換為十進(jìn)制才是我們想要的結(jié)果
*
* 4. 原碼如何轉(zhuǎn)換為反碼
* 符號(hào)位不變,其它位按位取反
* 5. 反碼如何轉(zhuǎn)換為補(bǔ)碼
* 反碼 + 1
*
* 6. 補(bǔ)碼如何轉(zhuǎn)換為反碼
* 補(bǔ)碼 - 1
*
* 7.反碼如何轉(zhuǎn)為我們的原碼
* 符號(hào)位不變,其它位按位取反
*
* 9-6 ---> 9 +(-6)
* 思路:需要先拿到9的補(bǔ)碼 和?。兜难a(bǔ)碼
*
* 9的原碼 0000 0000 0000 0000 0000 0000 0000 1001
* 9的反碼 0000 0000 0000 0000 0000 0000 0000 1001
* 9的補(bǔ)碼 0000 0000 0000 0000 0000 0000 0000 1001
*
* -6的原碼 1000 0000 0000 0000 0000 0000 0000 0110
* -6的反碼 1111 1111 1111 1111 1111 1111 1111 1001
* -6的補(bǔ)碼 1111 1111 1111 1111 1111 1111 1111 1010
*
* 9的補(bǔ)碼 0000 0000 0000 0000 0000 0000 0000 1001
* -6的補(bǔ)碼 1111 1111 1111 1111 1111 1111 1111 1010
* ---------------------------------------------------
* 10000 0000 0000 0000 0000 0000 0000 0011 去掉溢出的最高位1
* 0000 0000 0000 0000 0000 0000 0000 0011 ---->轉(zhuǎn)換為十進(jìn)制,結(jié)果是3
*
*
*
*
* 4 - 6 --> 4 + (-6)
*
* 4的原碼 0000 0000 0000 0000 0000 0000 0000 0100
* 4的反碼 0000 0000 0000 0000 0000 0000 0000 0100
* 4的補(bǔ)碼 0000 0000 0000 0000 0000 0000 0000 0100
*
* -6的原碼 1000 0000 0000 0000 0000 0000 0000 0110
* -6的反碼 1111 1111 1111 1111 1111 1111 1111 1001
* -6的補(bǔ)碼 1111 1111 1111 1111 1111 1111 1111 1010
*
* 4的補(bǔ)碼 0000 0000 0000 0000 0000 0000 0000 0100
* -6的補(bǔ)碼 1111 1111 1111 1111 1111 1111 1111 1010
*---------------------------------------------------
* 1111 1111 1111 1111 1111 1111 1111 1110
* 由于參與運(yùn)算的都是補(bǔ)碼,所以得到的結(jié)果也是補(bǔ)碼,并且得到的結(jié)果是一個(gè)負(fù)數(shù),
* 所以需要先轉(zhuǎn)換為原碼===>(補(bǔ)碼-->轉(zhuǎn)為反碼--->反碼再轉(zhuǎn)為原碼)
* 補(bǔ)碼轉(zhuǎn)反碼需要 -1
* 1111 1111 1111 1111 1111 1111 1111 1110 補(bǔ)碼
* 1111 1111 1111 1111 1111 1111 1111 1101 反碼 (補(bǔ)碼-1)
* 1000 0000 0000 0000 0000 0000 0000 0010 原碼(符號(hào)位不變,其它位取反)
*
*
*/
return 0;
}