进制转换

进制转换

1.明确:计算机中数字都是在内存中进行存储,并且这些数字都是以二进制的形式存储

2.明确:计算机软件代码中数字的表示形式(展现形式)有四种:

二进制表示,八进制表示,十进制表示,十六进制表示

注意:不管是哪种形式,都是对同一个内存中存储的数字的不同形式而已

内存中的数字不会因为表示形式不一样而发生改变

类比:人(数字)

在家(二进制形式)

在学校(八进制形式)

在公司(十进制形式)

在超市(十六进制形式)

人不管在哪里,本身是不改变的!

八进制,十进制,十六进制给程序看的,好看

二进制给计算机看,计算机只认二进制

3.明确:计算机把内存中每个字节又分8段,每段只能记录0和1

要想把一个数字存储到内存中,必须将这个数字分拆成若干个0和1存储到每个段中

所以:内存中的最小存储单元是位(bit)

结论:1Byte = 8bit

  2Byte = 16bit

  4Byte = 32bit

  8Byte = 64bit

例如:

char a = 'A'; //分配1字节内存空间,把字符A的ASCII码65分拆成8个0和1(需要8位)存储到内存中即可

short a =250; //分配2字节内存空间,把250分拆成16个0和1(需要16位)存储到内存中即可

int a = 250; //分配4字节内存空间,把250分拆成32个0和1(需要32位)存储到内存中即可

4.二进制

a)定义:用一组0和1表示数字的方法简称二进制表示形式

例如:现在又一个十进制数85(前提是char类型),要存储到内存中,必须以二进制的形式存储

所以需要将85分拆成8个0和1,最终其二进制表示形式为:01010101(二进制形式)

b)特点:

1.二进制数的编号:从0开始

  例如:前提是char类型

  高位 低位

  76543210 二进制数的编号

  01010101 二进制数


  例如:前提是short类型

  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 二进制数编号

  0  1  0  1  0  1  0 1 0 1 0 1 0 1 0 1 二进制数


2.二进制数中每个1单独代表一个10进制数字,这个10进制数字值是2的编号次方

  例如:前提是char类型

  高位 低位

  76543210 二进制数编号

  01000000 二进制数(其中第6位的1对应的10进制数字值是2的6次方 = 64)

3.二进制数中相邻的两个1,左边是右边的2倍

4.二进制数加1的时候把编号为0位置开始的多个连续的1变0,最左边的0变1(逢二进一)

  例如:

  76543210 二进制编号

  00001111 + 1 = 00010000

  00001110 + 1 = 00001111


----------------------------------------------------------------------------------------------

5.二进制和十进制之间的转换

问:10进制数85对应的2进制凭什么是01010101

2进制数01010101对应的10进制数凭什么是85

5.1.明确:计算机只认二进制,内存中只能存储数字的二进制形式

  至于10进制,8进制,16进制都是对内存中2进制数的另外三种表示形式


5.2.二进制表示的非负数(0和正数)转换成10进制就是把每个二进制中的1单独转换10进制然后相加

得到最终的10进制值

例如:前提是char类型

76543210 编号

01010101 二进制数85(非负数)

85对应的10进制数 = 2的6次方+2的4次方+2的2次方+2的0次方 = 64+16+4+1=85

结论:将来存储85就是讲85分拆成8个0和1即:01010101,存储到1字节的内存空间即可

5.3.10进制表示的非负数转2进制(85->01010101)

采用"除2取余,逆序排列"法:用2整除十进制整数,可以得到一个商和余数

再用2去除商,优惠得到一个商和余数,如此进行

直到商为小于1时为止,然后把先得到的余数作为二进制数的地位,

后得到的余数作为二进制数的高位,依次排列起来。

例如:前提是char类型,91这个10进制数转2进制过程:

91/2=45 余1

45/2=22 余1

22/2=11 余0

11/2=5 余1

5/2=2 余1

2/2=1 余0

1/2=0 余1

结果二进制数为:0101 1011(高位补0,凑够1字节)

结论:将91分拆成0101 1011保存到1字节内存即可

前提是short类型,789(用char和unsigned char无法表示,太大了)

789/2=394 余1

394/2=197 余0

197/2=98 余1

98/2=49 余0

49/2=24 余1

24/2=12 余0

12/2=6 余0

6/2=3 余0

3/2=1 余1

1/2=0 余1

2进制数=0000 0011 0001 0101(short类型,16位,所以高6位补0,凑够2字节,16位)

5.4.负数的10进制和2进制不能直接转换,必须借助相反数(-5的相反数位5)

a)10进制的负数转2进制的步骤:

  首先计算相反数,变成正数

  然后将相反数转成2进制

  最后取反加1得到10进制负数的2进制(取反的意思就是1变0,0变1)

  例如:求-14(前提是数据类型是char)的二进制

  1.计算-14的相反数为14

  2.将14转成2进制:00001110

  3.取反加1:11110001 +1 =11110010

  结论:-14的2进制为11110010


b)明确:有符号类型数字(不加unsigned关键字修饰的)才能有符号

二进制数中最左边的位叫符号位,通过此位可以确定数字的符号位(正还是负,人为自己判断添加符号)

符号位的值为0表示数字为非负数(0和正数),符号位的值为1表示此数字为负数

切记:讨论符号位的前提是必须确定数据类型

例如:01010101(前提是char类型),此数必然是正数

  10101000(前提是char类型),此数必然是负数

  注意:10101000(前提是unsigned char类型),此数没有必要讨论正负,因为加了unsigned说明就是非负数

  1000010110001000(前提是short类型),此数必然是负数

  0000111110010000(前提是char类型),此数必然是负数,因为虽然是16位,但是char类型只能要8位

所以从低位开始要8位即可,最后的二进制是:10010000,此时最高位为1,表示负数

  有了这个明确,现在就可以实现二进制表示的负数转十进制

  例如:求二进制数10110110的10进制(前提是char类型,显然是负数)

  1.先取反后加1:01001001 +1 = 01001010

  2.然后将2进制转10进制:01001010 = 2的6次方+2的3次方+2的1次方=64+8+1=74

  3.前提是已知这个2进制数为负数,所以最后求相反数:-74

  结论:10110110的10进制数为-74


  求:10101010二进制的10进制(char类型)

  求:10101010二进制的10进制(short类型)


------------------------------------------------------------------------------------------------------------------------

6.2进制和8进制之间的转换

a)定义:就是把2进制数从右边到左边每3位分一组

每组用一个0到7的数字替换得到8进制表示形式

注意:八进制数前面加0(零)来表示,0250(说明这个数是一个8进制数)

占位符:0%o

  例如:2进制数01101001(10进制是105)转8进制,三步骤:

  1.先分组:01 101 001

  2.换算:

01=2的0次方=1

101=2的2次方+2的0次方=5

001=2的0次方=1

  3.替换得到:0151

  结论:01101001的8进制数是0151


  参考代码:bit.c 演练8进制的占位符


  /*进制转换*/

  #include <stdio.h>


  int main(void){


int a = 105; //10进制数

//不管是10进制还是8进制,内存只存他们的2进制为:01101001

printf("a的十进制数是:%d,a的八进制数是:0%o\n",a,a);

int b = 0151; 8进制数

printf("b的十进制数是:%d,b的八进制数是0%o\n",b,b);

int c = 0xc3;

printf("c的十进制数是:%d,c的八进制数是:0%o,c的十六进制数是:%#x\n",c,c,c);

return 0;0                                                                                                       

  }

重磅好消息:实际开发2进制和10进制,2进制和8进制之间的转换记得用计算器!

---------------------------------------------------------------------------------------

7.2进制和16进制之间的转换(核心中的核心)

a)16进制定义:把2进制数从右边到左边每4位分为一组

  每组用一个字符替换(用a到f之间的字母替换10~15之间的数字)

  注意:16进制数前面需要添加0x或者0X,不区分大小写

  占位符:%#x或者%#X

  例如:11000011转换为16进制,分三步:

  1.先分组:1100 0011

  2.换算:

  1100=2的3次方+2的2次方=8+4=12

  0011=2的1次方+2的0次方=2+1=3

  3.替换

  12 -> c

  3 -> 3

  4.结果此二进制对应的16进制为:0xC3或者0Xc3或者0Xc3


b)切记:务必拿下2进制和16进制的转换(口算,不允许用计算器)

在程序中一般用16进制来表示2进制,16进制也就是2进制

结论:

16进制数 2进制

0 0000

1 0001

2 0010

3 0011

4 0100

5 0101(常用)

6 0110

7 0111

8 1000

9 1001

10 1010(常用)

11 1011

12 1100

13 1101

14 1110

15 1111

演练:

高位 低位

0x48 0100 1000

0xb6 1011 0110

0xfac7621d 1111 1010 1100 0111 0110 0010 0001 1101

0xa596bef1 1010 0101 1001 0110 1011 1110 1111 0001

分析:

由于内存的每个字节只能存8位,所以讲0xa596bef1这个数据分成4个字节,每个字节8位

分别是:0xa5,0x96,0xbe,0xf1

对应的二进制分别是:

0xa5->10100101

0x96->10010110

0xbe->10111110

0xf1->11110001

然后将这些二进制分别存储到对应的内存中即可,从地位到高位

Q:250(数据类型为int类型)这个10进制数在内存中如何存储的?

A:思路:250->0x000000FA->0000 0000 0000 0000 0000 0000 1111 1010->4字节内存

Q:-250如何存呢?

A:-250->0xFFFFFF06->1111 1111 1111 1111 1111 1111 0000 0110(+1)->4字节内存

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

推荐阅读更多精彩内容