综述:
编程中,我们常用的还是10进制……必竟C/C++是高级语言。比如:int a = 100,b = 99;
不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:0000 0000 0000 0000 0110 0100面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。
用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。
二、八、十六进制数转换到十进制数:
二进制数转换为十进制数:0110 0100转换 1 * 2e2+ 1 * 2e3+ 1 * 2e5+ 1 * 2e6= 100
八进制数转换为十进制数: 八进制就是逢8进1。八进制数采用 0~7这八数来表达一个数。1507换算成十进制:7 * 8e0 + 0 * 8e1 + 5 * 8e2 + 1 * 8e3 = 839
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。2AF5换算成10进制: 5 * 16e0 + F * 16e1 + A * 16e2 + 2 * 16e3 = 10997
十进制数转换到二、八、十六进制数
10进制数转换为2进制数:比如:6,如果将它转换成二进制数是110。
10进制数转换为8进制:转换的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。120转换为8进制,结果为:170
10进制数转换成16进制,和转换为2进制的方法类似,惟一变化:除数由2变成16。同样是120,转换成16进制则为:78
八进制数的表达方法和在转义符中的使用
C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。如:int a = 100;我们也可以这样写:int a = 0144; //0144是八进制的100。千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。
转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。比如,字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。
十六进制数的表达方法和在转义符中的使用
C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O),如:int a = 0x100F;int b = 0x70 + a; 注意:C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。
转义符也可以接一个16进制数来表示一个字符。如 '?' 字符,可以有以下表达方式:'?' //直接输入字符 '\77' //用八进制,此时可以省略开头的0 '\0x3F' //用十六进制
二、十六进制数互相转换
二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。
2进制数 快速计算方法 十进制值 十六进值
1111 = 8 + 4 + 2 + 1 = 15 F
1110 = 8 + 4 + 2 + 0 = 14 E
1101 = 8 + 4 + 0 + 1 = 13 D
1100 = 8 + 4 + 0 + 0 = 12 C
1011 = 8 + 4 + 0 + 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 10 9
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反过来,当我们看到 FD时,迅速将它转换为二进制数:FD转换为二进制数,为: 1111 1011
由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数: 0x4D2然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。
同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。下面举例一个int类型的二进制数:01101101 11100101 10101111 00011011我们按四位一组转换为16进制: 6D E5 AF 1B