一、机器数及真值
1、机器数
机器数就是数字在计算机中的二进制表示形式,机器数是有符号的,符号位是用一个二进制数的最高位来表示的:0代表正数,1代表负数。例:
假设计算机的字长为8,那 6 的二进制表达则为 0000 0110
-6 的二进制表示为 1000 0110
2、机器数所对应的真值
所谓真值就是将计算机数由二进制转换为十进制,其中最高位为符号位,所代表的数值。
例如: 1001 1101 的真值就为 -29
二、原码、反码与补码
1、原码
原码就是真值的二进制表示,最高位为符号位,以8位二进制表示为例:
6 原码: 0000 0110
-6原码: 1000 0110
2、反码
反码需要通过原码来计算:正数的反码就是原码,负数的反码为符号位不变,其他都取反。例:
[6]真值 -> [0000 0110]原码 -> [0000 0110]反码
[6]真值 -> [1000 0110]原码 -> [1111 1001]反码
3、补码
补码则是需要通过反码进行计算:正数的补码就是原码,负数的补码则是反码+1。例:
[6]真值 -> [0000 0110]原码 -> [0000 0110]反码 -> [0000 0110]补码
[6]真值 -> [1000 0110]原码 -> [1111 1001]反码 -> [1111 1010]补码
4、补码转原码
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,源求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
三、二进制、十进制、八进制、十六进制间的转换
二进制:用 0 和 1 来表示,二进一。
八进制:用0~7来表示,八进一。
十进制:用0~9来表示,十进一。
十六进制:用0~9以及字母A(10)、B(11)、C(12)、D(13)、E(14)、F(15)来表示,十六进一。
1、二进制转十进制
二进制:0000 1110 0110
十进制:2^1 + 2^2 + 2^5 + 2^6 + 2^7 = 230
2、八进制转十进制
八进制:1234
十进制:1234 = (1 × 8³) + (2 × 8²) + (3 × 8¹) + (4 × 8⁰) = 668
3、十六进制转十进制
十六进制:1AB
十进制:(1 × 16²) + (10 × 16¹) + (11 × 16⁰) = 427
4、十六进制转二进制
十六进制:1AB
二进制:0001 1010 1011
可以先将十六进制转换为十进制,再转为二进制。也可以将每个数字转为四位的二进制,然后拼接在一起。如:
1为0001 , A为1010 , B为1011 , 故其二进制表示为0001 1010 1011
四、左移运算符<<以及右移运算符>>的使用
计算机中的数字是以二进制补码的形式存放的,所以无论是左移运算符还是右移运算符,其都是需要先将目标数转换为二进制,然后求其补码,再进行运算。
1、左移运算符使用
运算规则:不区分正负数,将最高位抛弃,然后在低位补0,例:
求: 10<<3
10的原码: 0000 0000 0000 0000 0000 0000 0000 1010
10的反码: 0000 0000 0000 0000 0000 0000 0000 1010
10的补码: 0000 0000 0000 0000 0000 0000 0000 1010
左移三位: 0 0000 0000 0000 0000 0000 0000 1010
低位补充0: 0 0000 0000 0000 0000 0000 0000 1010 000
结果:80
求: -10<<3
-10的原码: 1000 0000 0000 0000 0000 0000 0000 1010
-10的反码: 1111 1111 1111 1111 1111 1111 1111 0101
-10的补码: 1111 1111 1111 1111 1111 1111 1111 0110
左移三位: 1 1111 1111 1111 1111 1111 1111 0110
低位补充0: 1 1111 1111 1111 1111 1111 1111 0110 000
转为原码: 1000 0000 0000 0000 0000 0000 0101 0000
结果:-80
2、右移运算符的使用
右移的话分为逻辑右移以及算术右移,这里只考虑算术右移,需要区分正负数。
(1)正数算术右移:将最低位抛弃,最高位补0,例:
求: 10>>3
10的原码: 0000 0000 0000 0000 0000 0000 0000 1010
10的反码: 0000 0000 0000 0000 0000 0000 0000 1010
10的补码: 0000 0000 0000 0000 0000 0000 0000 1010
右移三位: 0000 0000 0000 0000 0000 0000 0000 1
高位补充0: 000 0000 0000 0000 0000 0000 0000 0000 1
结果:1
(2)负数算术右移:将最低位抛弃,最高位补1,例:
求: -10>>3
-10的原码: 1000 0000 0000 0000 0000 0000 0000 1010
-10的反码: 1111 1111 1111 1111 1111 1111 1111 0101
-10的补码: 1111 1111 1111 1111 1111 1111 1111 0110
右移三位: 1111 1111 1111 1111 1111 1111 1111 0
高位补充1: 111 1111 1111 1111 1111 1111 1111 1111 0
转为原码: 1000 0000 0000 0000 0000 0000 0000 0010
结果:-2