计算机概念
在计算机内,定点数有3种表示法:原码、反码和补码。
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
反码是在原码的基础上提出来的,补码是在反码的基础上提出来的。它们都是有符号的。
[+7]原= 0 0000111 B [-7]原= 1 0000111
[+0]原= 0 0000000 B [-0]原= 1 0000000
反码
[+7]反= 0 0000111 B 反码[-7]反= 1 1111000 B
[+0]反= 0 0000000 B(将其当正数处理) 反码[-0]反= 1 1111111 B
补码
[+7]补= 0 0000111 B [-7]补= 1 1111001 B
[+0]补= 0 0000000 B [-0]补= 0 0000000 B
正数 源码=反码=补码
1 0000 0000
- 0000 0111
-------------------
1111 1001
假设-a = a0*2^0 + a1*2^2+a2*2^3 + ... + an*2^(n) (a>0)
则-a的补数b=(1-a0) * 2^0 + (1-a1)*2^1 + (1-a2)*2^2+... + (an) * 2^(n) + 1 (a>0)
那么 -a + b = 1 * 2^0 + ...+ 2*2^(n) + 1 = 1*2^0 + ...+2^n + 1 = 2^(n+2)
假设机器的字长为8
Delphi代码
begin
asm
mov al, 177
add al, 100
end
执行完后 al = 0x15 (发生溢出)
应该为256 + 21 = 277的,发生了截取。
begin
asm
mov al, -177 // al = 0x9c
add al, -100 // al = 0xEB
end