原码转补码

原创 2012年03月25日 15:09:24

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面

增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。这样一个数的8位原码表示中,第一位是符号位,剩余七位是数值的二进制表示。例如:-8的原码为10001000 ,其中左边第一位1是符号位,表示该数是一个负数,后面七位0001000表示该数的绝对值8。
补码是机器中最常用的一种二进制表示形式。把原码转换成补码有一条很简单的规则:
如果原码符号位是0,则补码与原码相同;否则,把原码除符号位外的其他各位取反加一得到补码。例如:
-8的原码为10001000,符号位为1,所以把数值位0001000取反得1110111,再加1得1111000,所以-8的补码为11111000。
当然,原码取反加一变补码,有发生溢出的可能。这里我们规定,溢出时,丢掉进位。例如10000000,把数值位0000000取反后得1111111,加1的10000000(1是由进位产生),把1丢掉的0000000,再加上前面的符号位1,最终得10000000。

Input
  第一行为一个正整数N,表示测试数据组数。
接下来是N行,每行表示一个8位二进制原码。
Output
  输出每个原码对应的补码,每个补码占独立的一行。
Sample Input
3
10001000
00000000
10000000
Sample Output
11111000
00000000
10000000
 
解题思路:
先定义一个字符窜数组来存储原码,再将后7个非符号的二进制字符窜转化为整数型存在另一个整数型数组的后七位,第一位赋值0。判断字符窜数组的第一位,若为0,则原样输出,若为1,则将整数
型数组的后七位进行相反数,即0变为1,1变为0,然后从最后一位加1,若大于1,就减去2,向前进1,最后看一下第一位是不是1,若为1,则直接输出,若为0,则赋值1.(其实不去理会溢出的问题
,直接将整数型数组的第一位赋值1,然后输出也行)
#include<stdio.h>
int main()
{
	char a[8];
	int b[8];
	int i,j,N;
	while(scanf("%d",&N)!=EOF)
	{
		for(i=0;i<N;i++)
		{
			scanf("%s",a);
			b[0]=0;
			if(a[0]=='0')
			{
				printf("%s",a);
				printf("\n");
			}
			else
			{
				for(j=1;j<8;j++)
					b[j]=a[j]-48;
				for(j=1;j<8;j++)
				{
					if(b[j]==0)
						b[j]=1;
					else
						b[j]=0;
				}
				b[7]+=1;
				for(j=7;j>0;j--)
				{
					
					if(b[j]>1)
					{
						b[j]=b[j]-2;
						b[j-1]+=1;
					}	
				}
				if(b[0]==1)
				{
					b[0]==1;
					for(j=0;j<8;j++)
						printf("%d",b[j]);
				}
				else
				{
					printf("1");
					for(j=1;j<8;j++)
						printf("%d",b[j]);
				}
				printf("\n");
			}
		}
	}
	return 0;
}

 

#include<stdio.h>
int main()
{
	char a[8];
	int b[8];
	int i,j,N;
	while(scanf("%d",&N)!=EOF)
	{
		for(i=0;i<N;i++)
		{
			scanf("%s",a);
			b[0]=0;
			if(a[0]=='0')
			{
				printf("%s",a);
				printf("\n");
			}
			else
			{
				for(j=1;j<8;j++)
					b[j]=a[j]-48;
				for(j=1;j<8;j++)
				{
					if(b[j]==0)
						b[j]=1;
					else
						b[j]=0;
				}
				b[7]+=1;
				for(j=7;j>0;j--)
				{
					
					if(b[j]>1)
					{
						b[j]=b[j]-2;
						b[j-1]+=1;
					}	
				}
				if(b[0]==1)
				{
					b[0]==1;
					for(j=0;j<8;j++)
						printf("%d",b[j]);
				}
				else
				{
					printf("1");
					for(j=1;j<8;j++)
						printf("%d",b[j]);
				}
				printf("\n");
			}
		}
	}
	return 0;
}


 


原码补码相互转换,简单方法

大家都知道,对于计算机中的运算,都是以二进制的形式计算,那么很多时候,原码,反码,补码的计算是很烦人的(对于我来说吧),所以有一种简单的方式: 记住,以下是原码和补码互换的(负数),正数的补码反码和...
  • u012480620
  • u012480620
  • 2016年11月02日 16:39
  • 7716

补码和原码的转化过程

在计算机系统中,数值一律用补码来表示(存储)。  主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补  码表示的数相加时,如果最高位(符号位)有进位,则进...
  • u010229420
  • u010229420
  • 2017年02月06日 17:10
  • 11145

【经典算法】:原码,反码,补码之间的转换问题

背景知识补充正数:原码=反码=补码 负数:原码 反码 补码之间 转换有规则(下面讨论) 0:分为+0 和 -0去考虑,符合上面那两条规则补充一个概念叫做符号位,把每个数第一位当作符号位,取0为整数...
  • qq_23100787
  • qq_23100787
  • 2015年09月24日 00:29
  • 1685

java原码、补码、反码总结

1.1. java虚拟机整数 在java虚拟机中整数有byte、short、int、long四种 分别表示 8位、16位、32位、64位有符号整数。整数使用补码表示。 所以我们先了解一下原码和反码。 ...
  • qq_30739519
  • qq_30739519
  • 2016年03月27日 14:02
  • 4684

计算机组成原理---如何将真值转成补码,原码,移码,反码。

引言(只想看怎么转换的可以跳过这一段) 数值数据(1,0.1..)在计算机中以(补码/原码/移码/反码)中的其中一种形式存在于计算机中。比如说22(无符号数)这个数,你要存在于计算机的话你总不可能...
  • NEXTLJP
  • NEXTLJP
  • 2017年11月08日 18:09
  • 317

C++菜鸟的成长之路(1)——浅谈原码、反码、补码

Yo Guys! 首先是自我介绍。我是你们的老狗。今儿这篇博客可是我的开山之作。至于为啥要开始写博客呢,这个主要还得感谢善良的学姐的监督(笑着活下去:D)。不管怎么说,之后的博客会记载我在代码学习中的...
  • OldBlackDog
  • OldBlackDog
  • 2017年04月18日 18:07
  • 291

补码转原码(算术左移一位负变正)

一、文章来由还是上一篇关于移位的问题,那么什么 int 型数只算术左移一位就可以从负数变成正数???二、又谈补码很早之前写过一篇关于补码的文章,但是长时间不看又差不多忘记了,翻出来看发现写的挺烂的,有...
  • Scythe666
  • Scythe666
  • 2015年12月05日 01:18
  • 1386

C语言算出原码、补码和反码

算出来的原码、补码和反码都是8进制的。 //,比如说0可以分为+0和-0, //原码反码都有两个,而补码只有一个;另外注意一下, //用位数表示的范围问题, //比如说用8位表示整数X的原码和...
  • xiaonaiquan
  • xiaonaiquan
  • 2015年10月28日 17:58
  • 1197

C语言实现原码补码输出

今天复习了一下C中的原码补码的知识,顺便编程使用for , while, do-while,goto,recursive 实现了补码和原码的输出。 核心思想: 借助一个字符串数组,将得到的原码和补码...
  • zhyh1435589631
  • zhyh1435589631
  • 2015年05月30日 20:19
  • 2890

C语言基础之《原码,反码,补码》

    关于原码,反码,补码我们必须先明确:        只有有符号数才有原码反码补码,其在内存中是以补码的形式存储, 无符号数在内存中是以二进制数的形式存储的!        所谓有符号数的原码就...
  • mimo54050
  • mimo54050
  • 2008年07月19日 10:31
  • 648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:原码转补码
举报原因:
原因补充:

(最多只允许输入30个字)