C语言求原码的补码问题

unsigned short int getbits(unsigned short value)

{

unsigned int short z;

z = value & 0100000;

if (z == 0100000)

{

z = ~value + 1;

}

else

{

z = value;

}

return z;

}
疑问之处: 1 求原码的补码为啥要用无符号整型,这样就无正负之分了,那有什么 好求的啊,因为无符号数的原码不就是本身吗?
2 为啥要用十进制整数0100000与value作与操作?这步主要是干什么的?

通过补码来求原码?

你以为补码原码是一一对应的吗?

八位补码,可代表带符号数-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; //返回原码

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-18
必须要用无符号数,位运算的规定就是如此,你想,如果有符号是负数,用哪个来位运算,结果呢
进行与运算是判断该数是否最大的负数,注意补码的数值范围,负数比正数多一个,该数为最小负数,表示范围内没有对应的正数
第2个回答  2023-01-09

C语言求原码的补码问题

可笑的问题!

在计算机系统中,数值,一律采用补码表示和存储。

在 C 语言中,各个变量,也都是用补码表示的。

即使你做了“求反加一”,所得到的,也是补码。

而且是“另一个数值”的补码。

在计算机中,原码、反码,都是不会出现的。

第3个回答  2011-01-20
几位的,如果8位的你可以试试
unsigned char qiufan(signed char x)
{
return(x<0?(~x+1):x);
}
其实按照自然的理解最好 ,数字就在计算机里,不变不换。。。
你所看的什么原啊反啊的都是你的理解
第4个回答  2011-01-19
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。

以下都以8位整数为例,

原码就是这个数本身的二进制形式。
例如
1000001 就是-1
0000001 就是+1

正数的反码和补码都是和原码相同。

负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。

为什么要设立补码呢?

第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补

第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)

有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个本回答被提问者采纳
相似回答