zealous_zzx 2023-01-19 18:29 采纳率: 100%
浏览 15
已结题

用代码输出一个数N的原码,反码和补码,我这样写对吗?

用代码输出一个数N的原码,反码和补码,我这样写对吗?

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,aa[10001],u,a[10001],b[10001],c[10001];
bool cmp=0;
signed main()
{
    cin>>n;
    if(n<0)cmp=1;
    int nn=abs(n);
    while(nn>0)    //将n转为二进制数 
    {
    	aa[++u]=nn%2;
    	nn/=2;
	}
	int t=7-u;
	for(int i=1;i<=u;i++)
	{
		a[u-i+1]=aa[i];
	}
	if(t!=0)
	{
		for(int i=1;i<=u;i++)
		{
			a[i+t]=a[i];
			a[i]=0;
		}
		u=7;
	}
	if(cmp==0)cout<<0;
	else cout<<1;
	for(int i=1;i<=u;i++)    //输出n的原码 
	{
		cout<<a[i];
		if(i==3)cout<<' ';
	}
	cout<<endl;
	if(cmp==0)
	{
		for(int i=1;i<=u;i++)b[i]=a[i];
	}
	else
	{
		for(int i=1;i<=u;i++)
		{
			if(a[i]==1)b[i]=0;
			else b[i]=1;
		}
	}
	if(cmp==0)cout<<0;
	else cout<<1;
	for(int i=1;i<=u;i++)    //输出n的反码 
	{
		cout<<b[i];
		if(i==3)cout<<' ';
	}
	cout<<endl;
	for(int i=1;i<=u;i++)
	{
		c[i]=b[i];
	}
	if(cmp==1)
	{
		c[u]++;
		int sum=u;
		while(c[sum]==2 && sum>=1)
		{
			c[sum]=0;
			c[--sum]++;
		}
	}
	if(cmp==0)cout<<0;
	else cout<<1;
	for(int i=1;i<=u;i++)    //输出n的补码 
	{
		cout<<c[i];
		if(i==3)cout<<' ';
	}
    return 0;
}
  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-01-19 18:37
    关注

    这个代码的大体思路是对的,但是有一些问题需要修改。

    你在将n转为二进制时使用了硬编码的方式,将n的二进制位数限制为7位。这是不符合实际的,你应该使用位运算来实现。

    你在输出原码,反码和补码时,输出了一个0或1,表示符号位。但是,在C语言中,整型数据默认是有符号的,不需要额外输出符号位。

    你在输出原码,反码和补码时使用了空格来分割数值,这样不够优美,可以考虑使用更好的方式来输出。

    你在计算补码时,计算的是反码的补码,这是错误的,原码的补码应该是在原码上取反再加1。

    你在计算补码时,没有考虑进位的情况,导致结果不正确

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 1月19日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装