一。
2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制,用0~9和A,B,C,D,E,F
举例:(使用10进制表示下列进制的数)
16进制的32 : 2×16^0+3×16^1=50
8进制的1507:7 × 8^0 + 0 × 8^1 + 5 * 8^2 + 1 × 8^3 = 839
2进制数的0110 0100: 0 ×2^0 + 0 × 2^1 + 1 × 2^2 + 1 ×2^3 + 0 × 2^4 + 1 × 2^5 + 1 × 2^6 + 0 × 2^7 = 100
二。为什么需要八进制和十六进制?
我们习惯使用10进制来思维,但是计算机确是使用2进制来表示,偶尔使用二进制可以有利于我们更好的解决问题,但是二进制数目是如此的长而难于思考和操作,比如一个int 类型占用4个字节,32位。一个10进制的100,用int类型的二进制数表达将是:
0000 0000 0000 0000 0110 0100
于是我们采用了一个折中的办法,使用8进制或者16进制,它们除了便于和2进制数进行转换,大大缩短表示长度之外,还很好的保留了2进制数的运算特点,便于做& | > 等2进制的运算。
三 一些规定
事实上,对某些数来说,我们既可以理解为10进制,也可以理解为8进制或者16进制,所以对8进制,我们需要以0开头,对16进制数,我们已0x开头。举例:
int a = 100 ; (10进制)
int a = 0000 0000 0000 0000 0110 0100 ; (2进制)
int a = 0144; (8进制 144 =4×8^0+4×8^1+1×8^2)
int a =0x64 ; (16进制)
四 负数
10进制数有正负之分,比如12表示正12,而-12表示负12;但8进制和16进制只能表达无符号的正整数,那么我们的计算机是怎么表示负数的呢?这就是原码、反码、补码的概念了。举例来说:
假设有一个int 类型的数,值为5,那么,计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二进制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
那么,-5在计算机中如何表示?在计算机中,负数以其正值的补码形式表达。什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是5的原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101 每一位取反
得11111111 11111111 11111111 11111010
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。