1.计算机内,有符号数的3种表示方法:原码,反码,补码。
(1)最高位为符号位,“0”为正,“1”为负,其余位为数值大小。
(2)反码:正数 反码 = 原码;
负数 反码 = { 符号位不变}且{ 数值位按位取反}
下面重点说一下补码!
2.整数的补码:
(1)正数的补码 = 原码;
(2)负数的补码 = { 原码符号位不变} 且 { 数值位按位取反+1}
or = { 原码符号位不变} 且 { 数值位从右边数第一个1及其右边的0保持不变,左边按位取反}
(3)举例:以十进制数+99和-99为例:(符号位0为正数,1为负数)
+99 原码 = 0110_0011 b
+99 补码 = 0110_0011 b
-99 原码 = 1110_0011 b
-99 补码 = 1001_1101 b
注意:(a)0的补码只有一个:
+0 原码 = 0000_0000 b,-0 原码 = 1000_0000 b
+0 反码 = 0000_0000 b,-0 反码 = 1111_1111 b
+0 补码 = 0000_0000 b,-0 补码 = 0000_0000 b -- 相同,均为0000_0000 b
(b)8位二进制数的表示范围:
8位原码: -127 d -- +127 d
1111_1111 b -- 0111_1111 b
8位反码: -127 d -- +127 d
1000_0000 b -- 0111_1111 b
8位补码: -128 d -- +127 d
1000_0000 b -- 0111_1111 b
3.纯小数的原码:小数点前一位为符号位,若为正,则后面数值位不变;
若为负,则后面数值位取反加1。
例子:0.9239 d 原码 = 0.1110_1100_1000_0100
补码 = 0.1110_1100_1000_0100
-0.9239 d 原码 = 1.1110_1100_1000_0100
补码 = 1.0001_0011_0111_1100
4.一般在硬件语言中使用二进制补码时,是不可能带有小数点的,而且一个数通常有正数和小数两部分,这种情况下最好的方法是先将该数转换为正数,再进行转换会。
例子: -87.36 原码 = 1101_0111 . 0101_1100_0010_1000
求其补码,计算过程如下:
先用 -87.36 * 2^16 = -5725224 d = 1101_0111_0101_1100_0010_1000 b
此时再取反加1,则补码 = 1010_1000_1010_0011_1101_1000 b,
最后再除2^16,恢复小数点的位置即可。
1.计算机内,有符号数的3种表示方法:原码,反码,补码。
(1)最高位为符号位,“0”为正,“1”为负,其余位为数值大小。
(2)反码:正数 反码 = 原码;
负数 反码 = { 符号位不变}且{ 数值位按位取反}
下面重点说一下补码!
2.整数的补码:
(1)正数的补码 = 原码;
(2)负数的补码 = { 原码符号位不变} 且 { 数值位按位取反+1}
or = { 原码符号位不变} 且 { 数值位从右边数第一个1及其右边的0保持不变,左边按位取反}
(3)举例:以十进制数+99和-99为例:(符号位0为正数,1为负数)
+99 原码 = 0110_0011 b
+99 补码 = 0110_0011 b
-99 原码 = 1110_0011 b
-99 补码 = 1001_1101 b
注意:(a)0的补码只有一个:
+0 原码 = 0000_0000 b,-0 原码 = 1000_0000 b
+0 反码 = 0000_0000 b,-0 反码 = 1111_1111 b
+0 补码 = 0000_0000 b,-0 补码 = 0000_0000 b -- 相同,均为0000_0000 b
(b)8位二进制数的表示范围:
8位原码: -127 d -- +127 d
1111_1111 b -- 0111_1111 b
8位反码: -127 d -- +127 d
1000_0000 b -- 0111_1111 b
8位补码: -128 d -- +127 d
1000_0000 b -- 0111_1111 b
3.纯小数的原码:小数点前一位为符号位,若为正,则后面数值位不变;
若为负,则后面数值位取反加1。
例子:0.9239 d 原码 = 0.1110_1100_1000_0100
补码 = 0.1110_1100_1000_0100
-0.9239 d 原码 = 1.1110_1100_1000_0100
补码 = 1.0001_0011_0111_1100
4.一般在硬件语言中使用二进制补码时,是不可能带有小数点的,而且一个数通常有正数和小数两部分,这种情况下最好的方法是先将该数转换为正数,再进行转换会。
例子: -87.36 原码 = 1101_0111 . 0101_1100_0010_1000
求其补码,计算过程如下:
先用 -87.36 * 2^16 = -5725224 d = 1101_0111_0101_1100_0010_1000 b
此时再取反加1,则补码 = 1010_1000_1010_0011_1101_1000 b,
最后再除2^16,恢复小数点的位置即可。