C语言求原码的补码问题
unsignedshortintgetbits(unsignedshortvalue){unsignedintshortz;z=value&0100000;if(z==0...
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作与操作?这步主要是干什么的? 展开
{
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 语言中,各个变量,也都是用补码表示的。
即使你做了“求反加一”,所得到的,也是补码。
而且是“另一个数值”的补码。
在计算机中,原码、反码,都是不会出现的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
几位的,如果8位的你可以试试
unsigned char qiufan(signed char x)
{
return(x<0?(~x+1):x);
}
其实按照自然的理解最好 ,数字就在计算机里,不变不换。。。
你所看的什么原啊反啊的都是你的理解
unsigned char qiufan(signed char x)
{
return(x<0?(~x+1):x);
}
其实按照自然的理解最好 ,数字就在计算机里,不变不换。。。
你所看的什么原啊反啊的都是你的理解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,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位原码能表示的数多一个
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,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位原码能表示的数多一个
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询