4.進(jìn)制的轉(zhuǎn)換/原碼/反碼/補(bǔ)碼

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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容