C语言原码补码问题

作者&投稿:印俊 (若有异议请与网页底部的电邮联系)
C语言求原码的补码问题~

通过补码来求原码?
你以为补码原码是一一对应的吗?
八位补码,可代表带符号数-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; //返回原码
}

int类型一般是16位,比如1就是0000 0000 0000 0001,其中有符号数第一位是符号位,正是0,负是1;
-20转换为二进制按规则应该是 1000 0000 0001 0100;这个就是原码,但是计算机中不是这么存储的;
然后将符号位以外的这15位取反,得到,1111 1111 1110 1011;这个叫反码
之后再加上1,得到,1111 1111 1110 1100;这个是补码(计算机中存储的-20)
从一个二进制数反推回十进制,按相反的顺序计算即可.

位运算>>,就是向右位移一定位数,正数补0,负数补1;
所以-20>>3就是111 1111 1111 1110 1(左边补出3个1,右边的100丢失)
得到1111 1111 1111 1101,这个是补码,(计算机中的数)
减1得1111 1111 1111 1100,这个是反码;
取反得1000 0000 0000 0011,这个是原码;(方便我们识别的数)
也就是十进制的-3.

你的这个是16的,我可以给你用8位解释一下(原理是一样的,我打起来比较方便~)

我们知道,8位二进制的补码表示范围是-128~127对吧。

而在计算机中数据都是以二进制补码进行存储的,那么-128的存储方式就是1000 0000,而它是没有原码和反码的,所以你不太能验证,对吧。

这是因为在计算机中,为了溢出特意定义的一个小玩意儿~

所以放到16来解释,它的最小值也是-32768。

但这已经是最小的数了,再减就会溢出……(理论上是这样的)

但是现实中的程序编译有一定的容错性,只要到了一定的计算机承认的位数就变成-1了。

这是因为计算机中的数好像一个轮回……

这个是我的计算机能接受的范围。


(我的计算机是32位的~)


经过实践验证了我说的东西……


如果你的程序要求指定了16位,那么就是-1,如果高于16位,就是 -32769。



整数有正整数和负整数,为了表示负数,一般用最高位来表示符号,因此,最高位是不能用来表示数值的。所以,一个16位的整数最大值为:

2^15=32767(10)=7FFF(16)=0111 1111 1111 1111(2),括号后面是进制。
也就是除去最高位,用来保存数值的位数是总位数-1,也就是15位。

而用1代表负数,0代表正数,按理,最小负数就应该是最高位设1:
FFFF(16)= - 32767 = 1111 1111 1111 1111(2)

但是这样的话,0值就有正负之分了,但数学上0是中性的没有正负之分,那么假如保留正0代表0,另一个,也就是1000 0000 0000 0000(2)就浪费了。因此编码专家采用补码表示法来表示负数,而正数保留原来的编码形式,叫做原码表示法。

补码是在原码基础上按位取反+1,也即:
取-32767的绝对值,也即去符号为32767(10)=7FFF(16)=0111 1111 1111 1111(2)
按位取反:1000 0000 0000 0000(2)
+1:1000 0000 0000 0001(2)
转换成16进制就是:8001
打印输出时,由于最高位为1,因此系统认为是负数,就按补码解码,输出为 -32767。

再来看看 -1
取-1的绝对值后的为1(10)=0001(16)=0000 0000 0000 0001(2)
按位取反:1111 1111 1111 1110(2)
+1:1111 1111 1111 1111(2)
转换成16进制: FFFF
同样打印输出时按补码解码,输出为-1

可见负数的绝对值越小(比如1),补码数值部分越大(7FFF),绝对值越大7FFF,补码数值部分越小0001,使得编码与原码的编码相反。这样,负0编码就可以看做 -32768了,把负0编码利用起来了。

验证一下 -32768:
取-32768的绝对值为32768(10)=8000(16)= 1000 0000 0000 0000(2)
按位取反: 0111 1111 1111 1111(2)
+1:1000 0000 0000 0000(2)
转换成16进制:8000

如果不用补码表示而是用原码表示负数数值,那么编码1000 0000 0000 0000(2)表示的是负0,且负数端最小值为 -32767,而采用补码表示,负0这个编码可以利用起来用来表示-32768。使得整数范围增加了1,达到-32768- +32767 ,不浪费编码空间。

1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]

[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

你给的10000000 00000000是用补码表示的。
也就是说:-32768的原码是:11000000000000000
那么他的补码就是符号位不变,其余各位取反再加1。

希望能帮到你。


有关原码、补码、反码的问题?
设机器数字长为8位(其中1位为符号位)对于二进制整数01111110和11111101当其分别代表无符号数、原码、补码和反码时,对应的真值:01111110当其分别代表无符号数、原码、补码和反码时,对应的真值是相同的,都是126 11111101当其分别代表无符号数、原码、补码和反码时,对应的真值:无符号数:253 原码:...

原码补码问题?
在计算机系统中,数值,一律用补码来表示和存放。原码和反码,在计算机中,都是不存在的。使用补码代表正负数值,可将负数,转换成正数来计算。这就可以节省硬件,只用加法器,便可实现加减法运算。补码,是是什么意思? 这得从【补数】谈起。计算机所计算的位数,是固定的,如八位机。。。位数限定之后...

汇编语言原码、反码、补码,还有真值问题
1、一个数的真值是这个数原本表示的大小。二进制真值,就是真值的二进制表示。比如-2,二进制真值就是-10B。2、是的。[X]补+[Y]补=[X+Y]补嘛 3、正数的补码就是它的原码;负数的话,将补码减1再按位取反能计算出原码 补码按位取反加1也能计算出原码 两种方法计算出来的结果相同。比如:8...

原码补码的问题?
-2 的补码,就再减一,得:1111 1110 = 254(十进制)。-3 的补码,就再减一,得:1111 1101 = 253。。。负数补码的定义式: 256 + 该负数。。。-128 的补码,就是 256-128 = 128 = 1000 0000。这就算出来了:-128 的补码。补码,和原码反码,毫无关系。谁非要用“原码取反加一”...

请教大家几个关于原码、反码、补码的问题
1、x=-0.110101 原码是:1.110101 只是把最高位(符号位)设为1 反码是:1.001010 符号位不变,后面的在原码基础上求反 补码是:1.001011 在反码的基础上加1

原码反码补码的意义
问题一:原码、补码和反码的概念??? 数在计算机中是以二进制形式表示的。 数分为有符号数和无符号数。 原码、反码、补码都是有符号定点数的表示方法。 一个有符号定点数的最高位为符号位,0是正,1是副。 以下都以8位整数为例, 原码就是这个数本身的二进制形式。 例如 0000001 就是+1 1000001 ...

关于原码反码和补码的问题
(x1)原码 = 011010 (x1)反码 = 011010 (x1)补码 = 011010 (x2)反码 = 100101 (x2)原码 = 111010 (x2)补码 = 100110 (x3)补码 = 101011 (x3)原码 = 110101 (x3)反码 = 101010 (x4)反码 = 01001 (x4)原码 = 01001 (x4)补码 = 01001 (x5)补码 = 010101 (x5)原码 = 010101 (...

计算机补码原码问题
计算机以二进制补码存储数据以16位机器为例:比如83的二进制码为:0000 0000 0101 0011 由于正数的源码、反吗、补码,上面的既是源码,也是反码和补码下面通过负数讲解源码、反码、补码之间的关系以-83为例先求出-83绝对值的源码:0000 0000 0101 0011 计算机区分正负数通过判断最高位符号位,1为负数...

c语言中原码,补码分别是什么意思
原码:正数末尾取0,负数尾数为1;补码:正数=原码,负数为反码(除符号位)+1 比如 12 -12 原码 0001100 1001100反码 0001100 1110011补码 0001100 1110110

问一个关于原码,反码,补码的问题
原码 反码 补码不一定要在一个范围里面 是对于二进制数的编码 80H你可以化成二进制数10000000 这个二进制数的原码当然就是它本身 而它的反码只需要按位取反就可以 就是 01111111 而因为它是一个正数 所以它的补码和它的原码相同,也是10000000 如果是负数的话就应该是按位取反 末尾加1就...

隰县17038627742: C语言求原码的补码问题
支章晨克: 数在计算机中是以二进制形式表示的. 数分为有符号数和无符号数. 原码、反码、补码都是有符号定点数的表示方法. 一个有符号定点数的最高位为符号位,0是正,1是副. 以下都以8位整数为例, 原码就是这个数本身的二进制形式. 例如 ...

隰县17038627742: 关于C语言原码, 补码问题
支章晨克: 管它是几进制都要化为二进制来算 八进制 原码补码都是10 1110 十进制 原码补码都是11 1000 十六进制 原码补码都是 101 0110

隰县17038627742: C语言写一函数:给出一个数的原码,得到该数的补码 -
支章晨克: 0100000是八进制数.即二进制数:1000 0000 0000 0000.z=value&0100000;//意义就是取value的最高位.if(z==0100000)//如果最高位是1,即为负数,需要求补 z=~value+1;//求补,即取反+1 else z=value;

隰县17038627742: 用C语言编一个程序,使给出一个数的原码,求得反码,补码. -
支章晨克: #include<stdio.h> int main(){ int i,j,k; int a[16], af[16], ab[16];//af存储反码,ab存储补码第0位为符号位 char b[16]; scanf("%s", b); for(i = 0; b[i] != '\0'; i++){ a[i] = b[i] - '0'; } j = i-1; ab[0] = af[0] = a[0];//符号位始终不变 if(a[0] == 1){//当从屏幕输入的是...

隰县17038627742: 编程原码转补码 -
支章晨克: 1:我们来看一下补码的求得过程:将原码的各位取反,再加1,得到补码.举个例子,1001,它全部取反之后就是0110,再加1得到0111.将原码与补码加相,会得到10000.我们应该知道,计算机最基础的运算器只能做加法,所以叫累加器,...

隰县17038627742: 在C语言中,“原码,反码和补码”有什么不同啊? -
支章晨克: 正数的原码,反码和补码都一样的,而负数就不一样了!计算机为了让所有的数都是进行同一个加法运算,就有了原码,反码和补码的产生!负数的补码等于它的绝对值的原码取反后得到这个负数的反码,而在反码的基础上加1就变成了这个负...

隰县17038627742: 您好,我这边是C语言的初学,我对原码 补码 反码非常不理解,基本属于 -
支章晨克: 举个例子,一个数,你把它转换成二进制数,比如:+6=0110 -6=1110(第一位作为符号位,0为正,1为负) 原码:原码就是它本身: 0110(原码)=01101110(原码)=1110 反码:正数不变,负数除符号位,取反. 0110是正数,反码是它本身:0110(反码)=0110 1110是负数,除符号位取反:1110(反码)=1001 补码=反码+1: 0110(补码)=0110(反码)+1=0111 1110(补码)=1110(反码)+1=1001+1=1010 希望可以帮到你.

隰县17038627742: C程序设计中为什么有原码,反码,补码的存在?它们各有何意义? -
支章晨克: 是编程语言就有原码、反码、补码存在. C语言既像低级语言,又像高级语言,因此有人把它称为中级语言. 而在低级语言里(汇编语言),原码、反码、补码是个很重要的,因此感觉C语言里经常提到原码、反码和补码.

隰县17038627742: C语言中负数的补码怎么求比如 - 9,怎么求的,现在我知道正数补码最高位0,负数最高位为1,先求原码的反码,再把反码加1,能把 - 9的补码过程给我演算一... -
支章晨克:[答案] 八位二进制 9是00001001 逐位取反 11110110 加一 11110111 加符号位 111110111

隰县17038627742: 原码 补码 反码 之间有什么关系 -
支章晨克: 原码、反码、补码 1、 表示一个数值要先说明是用多少bit,例如: 用8bit表示数值时,(-128)没有相对应的原码和反码, (-128)补码 = (1000 0000) 同理(2B=16bit)表示:(-32768)补码=(1000 0000 0000 0000),后面回给出证明...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网