有符号位的二进制数,在计算原码和补码时那个符号位是始终不变的吗?
如 用8位二进制数表示十进制数 :
12的原码为 00001100
-12的补码为:( 00001100)取反得(11110011),末位+1,得(11110100)
有符号位的数据类型如 byte 型,占8为二进制数,最高位是符号位
如一个byte型变量的内存存储状态为10000000
怎样计算它的值? 逆推:补码10000000末位-1,得(01111111),各位取反得原码(10000000),转换为10进制数是128,因为是负数,所以是-128
逆推过程中符号位改变了。各位取反得到的原码(10000000)是没有符号位的,所以1不是符号位?
我的逻辑对吗?还有什么需要补充的?那个符号位的问题有点纠结 展开
对于带符号数,才会有采用什么码型来表示的问题。10000000确实是-128的补码。对于带符号数,最高位是符号位,0表示正数、1表示负数,始终不变。所有的码型换算,都只针对低位的绝对值部分进行。
例如12的原码是00001100,-12的原码是10001100。对其绝对值部分0001100求反加1得1110100,最高位添上符号位1,就是补码11110100。
所以码型转换运算只针对绝对值部分,不针对符号位,符号位始终不变。
因为对于带符号数而言,真正的表示范围是-127~+127,这其中包含了两个0:+0(00000000)和-0(10000000)。而实际应用中,0是没有符号的,所以规定0用+0来表示,那么-0就是一个没有用的二进制码了,而对于低7位而言,模为128,那么128与0就是等值的,此时符号位是负的,于是规定-0就表示-128。这是人为规定。
在计算机系统中,数值,一律采用补码表示和存储。
在计算机中,原码和反码,都是不存在的。
求补码,也用不着它们。
所以,原码和反码,根本就没有用!
符号位,更是无稽之谈。
------------------------
补码,其实,就是一个“代替负数做运算”的正数。
且看 2 位 10 进制数的运算:
25 - 1 = 24
25 + 99 = (一百) 24
你舍弃进位,只取两位,这两种算法,功能就完全相同。
那么,+99,就代替了-1。加法,也就代替了减法。
这不就是“用正数(补数)代替了负数”吗?
求负数的补数,计算公式是: 补数 = 负数 + 10^n。
式中: n 是补数的位数。
10^n 是 n 位 10 进制数的计数周期。
-------------------------
计算机用二进制,补数,就改称为:补码。
计算机所能计算的位数,是固定的,如八位机、16 位。。。
八位二进制是:0000 0000~1111 1111 (十进制 255)。
八位二进制的计数周期,是:2^8 = 256。
求负数补码的计算公式,也是: 负数 + 周期。
-1 补码就是:-1 + 256 = 255 = 1111 1111(二进制)。
-2 补码就是:-2 + 256 = 254 = 1111 1110(二进制)。
。。。
-128 补码就是:128 = 1000 0000(二进制)。
正数,必须直接参加运算,不许转换。
所以,正数不存在补码。
求补码,根本就不用“原码反码符号位取反加一”这些烂事。
-------------------------
举例说明,用八位补码计算: 5 - 7 = -2。
5 = 0000 0101
-7 的补码= 1111 1001
--相加-------------
得 (1) 1111 1110 = -2 的补码
舍弃进位,只保留八位,这就用加法,实现了 5-7。
--------------------------
在以上的讲解中,用到“符号位”了吗? 没有!
符号位,是在原码中定义的。反码也涉及到一点。
转到了补码,就不能再说什么符号位了。
而且,在计算机中,原码,也是根本就不存在的。
所以,符号位,只是他们臆想出来的,是虚无缥缈的。
根本就不用费那么多事。
正数的补码,就是该数本身。
负数的补码,就用其正数,减一取反,就成可了。
例如,已知:+9 的补码是:0000 1001。
求-9 补码步骤如下:
先减一:0000 1001-1 = 0000 1000。
再取反,即得:-9 补码 = 1111 0111。
这不就完了吗?
原码反码符号位,这些,都是垃圾。
对于带符号数,才会有采用什么码型来表示的问题。10000000确实是-128的补码。对于带符号数,最高位是符号位,0表示正数、1表示负数,始终不变。所有的码型换算,都只针对低位的绝对值部分进行。
例如12的原码是00001100,-12的原码是10001100。对其绝对值部分0001100求反加1得1110100,最高位添上符号位1,就是补码11110100。
所以码型转换运算只针对绝对值部分,不针对符号位,符号位始终不变。
那-128用补码表示,过程是怎样的?128的的原码是10000000,取其绝对值部分 0000000求反得
1111111,加1得0000000(是只取后7位吗?),再在首位添上1得10000000.
是的。因为对于带符号数而言,真正的表示范围是-127~+127,这其中包含了两个0:+0(00000000)和-0(10000000)。而实际应用中,0是没有符号的,所以规定0用+0来表示,那么-0就是一个没有用的二进制码了,而对于低7位而言,模为128,那么128与0就是等值的,此时符号位是负的,于是规定-0就表示-128。这是人为规定。