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; //返回原码
}
C语言求原码的补码问题
可笑的问题!
在计算机系统中,数值,一律采用补码表示和存储。
在 C 语言中,各个变量,也都是用补码表示的。
即使你做了“求反加一”,所得到的,也是补码。
而且是“另一个数值”的补码。
在计算机中,原码、反码,都是不会出现的。