4.进制的转换/原码/反码/补码

1.进制的基本概念

A.什么是进制?

进制数一种计数的方式,数值的表现形式

B.常见的进制有哪些?

十进制、二进制、八进制、十六进制

C.进制书写的格式和规律?

十进制: 0、1、2、3、4、5、6、7、8、9 逢十进1

二进制: 0、1 逢二进1;

               书写形式:需要以0b或者0B开头,例如:0b101

八进制:0、1、2、3、4、5、6、7 逢八进一

               书写形式:在前面加个0,例如:061

十六进制:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一

               书写形式:在前面加个0x或者0X,例如:0x45

2. 不同进制表示与输出

//
// Created by billge on 2022/12/2.
//

/**
 * 不同进制表示与输出
 */

#include <stdio.h>
int main() {

  /**
   *  1.在C语言中如何告诉编译器,当前编写的数值是多少进制的?
   *  默认情况下,所有编写的数值都是十进制的
   *
   *  如果想在C语言中表示一个数值是八进制的,那么必须在前面加上0
   *  如果想在C语言中表示一个数值是十六进制的,那么必须在前面加上0x
   *  如果想在C语言中表示一个数值是二进制的,那么必须在前面加上0b
   *
   *
   *  2.在C语言中如何以不同的进制来输出某一个数值
   *  %i/%d以十进制的形式输出数值
   *  %o 以八进制的形式输出数值
   *  %x 以十六进制的形式输出数值
   *  注意点:
   *  在c语言中没有提供以二进制输出的占位符
   */

  int num_1 = 12;//默认情况就是十进制
  printf("num1 = %i\n", num_1);//%i/%d是以十进制的形式输出数值 num1 = 12
  printf("num1 = %o\n", num_1);//14
  printf("num1 = %x\n", num_1);//c

  int num_2 = 014;//以0开头就是八进制
  printf("num2= %d\n",num_2); //num2 = 12
  int num_3 = 0xc;//以0x开头的是十六进制
  printf("num3= %d\n",num_3); //num3 = 12
  int num_4 = 0b1100;//以0b开头的是二进制
  printf("num4= %d\n",num_4); //num3 = 12





  return 0;
}

3.进制转换

//
// Created by billge on 2022/12/2.
//


/**
 * 进制的转换
 */

#include <stdio.h>

int main() {

  /**
   * 1.十进制转二进制
   * 规律:除以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.二进制转十进制
   * 规律:系数 × 基数(索引)
   * 系数:二进制中每一位对应的值就是系数
   * 基数:从二进制转到十进制的基数就是2
   *      从八进制转到十进制的基数就是8
   * 索引:从二进制的最低位开始,从0开始递增的数就是索引
   *
   *  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.十进制转八进制
   * 规律:除以8倒序取余
   * 4.十进制转十六进制
   */

  /**
   * 十进制转八进制
   * 24
   *  8
   *----
   *  3    0
   *  8
   *----
   *  0    3
   * ==============
   *   倒序:30
   *
   */
  int num_3 = 030;
  printf("num_3=%d\n", num_3);//num_3=24


  /**
   * 十进制转十六进制
   *
   * 24
   * 16
   *----
   *  1      8
   *  16
   *----
   *  0       1
   *=============
   *  倒序:18
   *
   */
  int num_4 = 0x18;
  printf("num_4=%d\n", num_4);//num_4=24



  /**
   * 5.八进制转十进制
   * 规律:系数 × 基数(索引)
   * 系数:八进制中每一位对应的值就是系数
   * 基数:从八进制转到十进制的基数就是8
   * 索引:从八进制的最低位开始,从0开始递增的数就是索引
   *
   *  030
   *  0*8(2) + 3*8(1) + 0*8(0)
   * = 0  +  24  + 0  =  24
   *
   *
   */



  /**
   * 6.十六进制转十进制
   * 规律:系数 × 基数(索引)
   * 系数:十六进制中每一位对应的值就是系数
   * 基数:从十六进制转到十进制的基数就是16
   * 索引:从十六进制的最低位开始,从0开始递增的数就是索引
   *
   *  0x18
   *
   *  1*16(1) + 8*16(0) = 16 + 8 = 24
   *
   */






  /**
   * 7.二进制转八进制
   * 规律:三个二进制位就是一个八进制位
   *  案例:01101101
   *
   *  111 = 7
   *  1*2(2) + 1*2(1) + 1*2(0) = 7
   *  因为111代表的数值就是7,而八进制的每一位最大的值是7
   *  所以三个二进制位代表一个八进制位
   *  01101101举例拆分为三个一组,如果不够则补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.二进制转十六进制
  * 规律:四个个二进制位就是一个十六进制位
  *  案例:01101101
  *
  *  1111 = 15
  *  1*2(3) + 1*2(2) + 1*2(1) + 1*2(0) = 15
  *  因为1111代表的数值就是15,而十六进制的每一位最大的值是15
  *  所以四个二进制位代表一个十六进制位
  *  01101101举例拆分为四个一组,如果不够则补0,如下:
  *  0110  1101
  *  6    13(D)====>因为十六进制是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.原码/反码/补码

//
// Created by billge on 2022/12/2.
//

#include <stdio.h>

/**
*
 *  原码,反码 和 补码
 *
*/

int main() {

  /**
   * 1.二进制在内存中的不同表现形式
   *   原码/反码/补码
   *
   * 2.正数的原码/反码/补码
   * 9--->int类型--->占用4个字节--->1个字节是8位--->总共占用32位
   * 0000 0000 0000 0000 0000 0000 0000 1001
   * 对于正数来说  ,原码/反码/补码 三码合一
   * 正数的原码/反码/补码都是它的二进制
   *
   * 3.负数的原码/反码/补码
   * -9--->int 类型--->占用4个字节--->1个字节是8位--->总共占用32位
   *  1000 0000 0000 0000 0000 0000 0000 1001
   *
   *  二进制的最高位我们称之位符号位,如果是0,代表是一个正数,如果是1,代表是一个负数
   *  3.1负数的原码就是负数的二进制
   *  3.2负数的反码就是负数的二进制除了最高位以外,按位取反
   *   1000 0000 0000 0000 0000 0000 0000 1001
   *   最高位不变,其它位1变成0,0变成1
   *   1111 1111 1111 1111 1111 1111 1111 0110
   *  3.3负数的补码就是负数的反码加个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.计算机为什么要有原码/反码/补码
   *   计算机只能做加法运算
   *   1+1 ---> 1+1
   *   1-1 ---> 1 + (-1)
   *   3*3 ---> 3 + 3+ 3
   *   9/3 ---> 9 + (-3) + (-3) + (-3)
   *
   * 需求:要求计算 1 - 1的结果
   * //先用1的原码和-1的原码进行计算
   * 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的反码进行计算
   * 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的补码和-1的补码进行计算
   * 0000 0000 0000 0000 0000 0000 0000 0001     1的补码
   * 1111 1111 1111 1111 1111 1111 1111 1111     -1的补码
   * ----------------------------------------------------
   * 10000 0000 0000 0000 0000 0000 0000 0000
   * 0000  0000 0000 0000 0000 0000 0000 0000(最高位被丢弃)   结果就是0
   *
   *  总结:原码/反码/补码 为了保证计算结果正确
   *
   *
   */



  /**
   * 1.在计算机中存储的所有数据都是补码
   * 2.在计算机参与运算的都是补码
   * 3.如果计算的结果是一个正数,那么直接将计算的结果转换为十进制就是我们想要的结果
   *   如果计算的结果是一个负数,那么直接将计算的结果先转换为原码,然后再转换为十进制才是我们想要的结果
   *
   * 4. 原码如何转换为反码
   * 符号位不变,其它位按位取反
   * 5. 反码如何转换为补码
   *  反码 + 1
   *
   * 6. 补码如何转换为反码
   *  补码 - 1
   *
   * 7.反码如何转为我们的原码
   * 符号位不变,其它位按位取反
   *
   * 9-6 ---> 9 +(-6)
   * 思路:需要先拿到9的补码 和 -6的补码
   *
   * 9的原码  0000 0000 0000 0000 0000 0000 0000 1001
   * 9的反码   0000 0000 0000 0000 0000 0000 0000 1001
   * 9的补码   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的补码  1111 1111 1111 1111 1111 1111 1111 1010
   *
   * 9的补码   0000 0000 0000 0000 0000 0000 0000 1001
   * -6的补码   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  ---->转换为十进制,结果是3
   *
   *
   *
   *
   * 4 - 6 --> 4 + (-6)
   *
   * 4的原码  0000 0000 0000 0000 0000 0000 0000 0100
   * 4的反码   0000 0000 0000 0000 0000 0000 0000 0100
   * 4的补码   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的补码  1111 1111 1111 1111 1111 1111 1111 1010
   *
   * 4的补码   0000 0000 0000 0000 0000 0000 0000 0100
   * -6的补码  1111 1111 1111 1111 1111 1111 1111 1010
   *---------------------------------------------------
   *          1111 1111 1111 1111 1111 1111 1111 1110
   *  由于参与运算的都是补码,所以得到的结果也是补码,并且得到的结果是一个负数,
   *  所以需要先转换为原码===>(补码-->转为反码--->反码再转为原码)
   *  补码转反码需要 -1
   *   1111 1111 1111 1111 1111 1111 1111 1110  补码
   *   1111 1111 1111 1111 1111 1111 1111 1101  反码 (补码-1)
   *   1000 0000 0000 0000 0000 0000 0000 0010  原码(符号位不变,其它位取反)
   *
   *
   */



  return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容