原码、反码、补码

原码

原码由第一位的符号位和后面的数值位构成,如32位二进制中:

数值 原码
\(1\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001\)
\(-1\) \(1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001\)
\(2147483647\) \(0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)
\(-2147483647\) \(1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)
\(0\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)
\(1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)

所以32位二进制用原码表示的范围是 \([-2147483647, 2147483647]\),其中 \(0\) 有两种表示方法,因为 \(0\) 是不分正负的

反码

正数的反码是其原码本身,负数的反码是符号位不变,数值位的每一位都取反,如32位二进制中:

数值 反码
\(1\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001\)
\(-1\) \(1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1110\)
\(2147483647\) \(0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)
\(-2147483647\) \(1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)
\(0\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)
\(1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)

所以32位二进制用反码表示的范围是 \([-2147483647, 2147483647]\),其中 \(0\) 有两种表示方法

补码

正数的补码是其原码本身,负数的补码是其反码加 \(1\),如32位二进制中:

数值 反码
\(1\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001\)
\(-1\) \(1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)
\(2147483647\) \(0111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\ 1111\)
\(-2147483647\) \(1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0001\)
\(0\) \(0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)
\(-2147483648\) \(1000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000\)

所以32位二进制用反码表示的范围是 \([-2147483648, 2147483647]\),其中 \(0\) 只有一种表示方法

上一篇:oracle等待事件的相关知识


下一篇:mysql为用户添加远程连接权限