原码、反码、补码的定义是什么?
计算机用0和1来表示一个整数,而整数有正负之分。
原码: 最高位为符号位,正数为0,负数为1.非符号位为二进制的绝对值表示。
反码:正数反码与原码一致,负数反码就是原码按位取反,除去符号位不变,保持为1。
补码, 正数补码与原码一致,负数补码是反码+1,即补码=反码+1. 也可以计算为:以原码进行操作,符号位不变,保持为1,其余位取反,直到碰到最后一个1为止,那个1及以后的数字不再取反。又:原码的第一个1和最后一个1之间的数字,全部取反。
举例说明:16位机,十进制,+6,-4,三码分别如何用hex表示?
原码 | 反码 | 补码 | |
6 | 0X0006 | 0X0006 | 0X0006 |
-6 | 0X8006 | 0XFFF9 | 0xFFFA |
4 | 0X0004 | 0X0004 | 0X0004 |
-4 | 0x8004 | 0XFFFB | 0XFFFC |
正数三码一致。jsj数字运算均基于补码。
负数补码为其模减去该数的绝对值。
举例,对于16位机,0XFFFC是多少?可能是有符号的 -4,也可能就是无符号的65532 !
65532+4=65536=2^16
来个更简易负数补码计算方法:
abs(-m) < 2^n,补码表示为: 2^n-m,前头根据字长自行补足F,n =[4,8,12,16...32],步长=4
Number | ABS | 字长 | |||
8 | 16 | 32 | 64 | ||
-9 | 9 | 0xF7 | 0XFFF7 | 0XFFFFFFF7 | 自加F |
-18 | 0X12 | 0XEE | 0XFFEE | 0XFFFFFFEE | 自加F |
-650 | 0X28A | 0XFD76 | 0XFFFFFD76 | 自加F | |
--73142 | 0X11DB6 | 0XFFFEE24A | 自加F |