通过补码来求原码?
你以为补码原码是一一对应的吗?
八位补码,可代表带符号数-128~127。
八位原码,可代表带符号数-127~127。
由此可知,-128 只有补码,没有原码。
在八位补码中,0~127,是按照正数的原码来存放的。
另外的 128~255,则是代表数字-128~-1。
将 129~255 “取反加一”,即为-127~-1 原码。
而 128,没有对应的原码。
八位补码转成原码的程序如下:
unsigned char getbits(unsigned char value)
{ // value : 0~255
if (value == 128) printf("此补码并无原码")
else if (value >128) value = ~value + 1 + 128
//如果是负数,取反加一,并补上符号位,得到原码
return value //返回原码
}
c语言补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1 (即在反码的基础上+1)。[+1] = [00000001](原码) = [00000001](反码) = [00000001](补码) [-1] = [10000001](原码) = [11111110](反码) = [11111111](补码) 对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。 一、原码 求原码:X≥0,则符号位为0,其余照抄; X≤0,则符号位为1,其余照抄。 【例1】X=+1001001 [X]原 = 01001001 【例2】X=-1001001 [X]原 = 11001001 二、反码 求反码:若X≥0,符号位为0,其余照抄; 若X≤0,符号位为1,其余按位取反。 【例3】X=+1001001 [X]反 = 01001001 【例4】X=-1001001 [X]反 = 10110110 三、补码 求补码:若X≥0,符号位为0,其余照抄; 若X≤0,符号位为1,其余取反后,最低位加1。 【例5】X=+1001001 [X]补 = 01001001 【例6】X=-1001001 [X]补 = 10110111
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)