挑战面试编程:原码、反码、补码

原码、反码、补码是关于整数在计算机中的三个概念。在计算机中,对于整数是这样存储的,在所有的二进制位中用一位(最高位)当做符号位,约定0表示正数,1表示负数,其余的是数值位。需要指出正数的原码、反码、补码都是一样的。对于sizeof(int)为4的环境,1 的二进制是 0000 0000 0000 0000 0000 0000 0000 0001 (原码)-1的二进制是 1000 0000 0000 0000 0000 0000 0000 0001 (原码)反码反码则规定为相对于原码符号位不变,数值
摘要由CSDN通过智能技术生成

                      挑战面试编程:原码、反码、补码

原码、反码、补码是关于整数在计算机中的三个概念。

在计算机中,对于整数是这样存储的,在所有的二进制位中用一位(最高位)当做符号位,约定0表示正数,1表示负数,其余的是数值位。需要指出正数的原码、反码、补码都是一样的。对于sizeof(int)为4的环境,

1 的二进制是 0000 0000 0000 0000 0000 0000 0000 0001 (原码)

-1的二进制是 1000 0000 0000 0000 0000 0000 0000 0001 (原码)

反码

反码则规定为相对于原码符号位不变,数值位取反

1111 1111 1111 1111 1111 1111 1111 1110  (-1的反码)

补码

补码则规定为相对于反码加一

1111 1111 1111 1111 1111 1111 1111 1111  (-1的补码)

需要指出,整数在内存中都是以补码的形式存在的,故运算的时候是以补码的形式参与的。

补码的提出,简化了运算,它存在的意义是:在进行运算时符号位和数值位同等对待。也就是说所有的二进制位都参与运算。

举个例子

-1+2=1

-1的补码

1111 1111 1111 1111 1111 1111 1111 1111

2的补码

0000 0000 0000 0000 0000 0000 0000 0010

补码相加

0000 0000 0000 0000 0000 0000 0000 0001  这就是1的补码。

若没有补码的概念,则-1+2时,需先获取各自的符号。若异号,则还需根据两数绝对值的大小来确定最后的符号。


下面写一函数来打印整数的原码、反码、补码

#include <stdio.h>
#include <stdlib.h>

//打印原码
void print1(int num)
{
	unsigned int i;
	i = 1 << (sizeof(int)* 8 - 1);
	if (num < 0)
	{
		num = num - 1;
		num = ~num;
		num |= i;   //设置符号位
	}
	while (i)
	{
		static int k = 1;
		printf("%c", num & i ? '1' : '0');
		if (k % 4 == 0)
			printf(" ");
		i >>= 1;
		k++;
	}
	printf("\n");
}
//打印反码
void print2(int num)
{
	unsigned int i;
	i = 1 << (sizeof(int)* 8 - 1);
	if (num < 0)
	{
		num = num - 1;
		num |= i;    //设置符号位
	}
	while (i)
	{
		static int k = 1;
		printf("%c", num & i ? '1' : '0');
		if (k % 4 == 0)
			printf(" ");
		i >>= 1;
		k++;
	}
	printf("\n");
}
//打印补码
void print3(int num)
{
	unsigned int i;
	i = 1 << (sizeof(int)* 8 - 1);
	while (i)
	{
		static int k = 1;
		printf("%c", num & i ? '1' : '0');
		if (k % 4 == 0)
			printf(" ");
		i >>= 1;
		k++;
	}
	printf("\n");
}
void main()
{
	int num = -1;
	printf("num = %d\n", num);
	printf("原码\n");
	print1(num);
	printf("反码\n");
	print2(num);
	printf("补码\n");
	print3(num);
	system("pause");
}
运行





三个print()函数,内容大多重复,写成一个函数:

/*
打印整数的原码、反码、补码
flag是标记:0是原码,1是反码,其它值都是补码
*/
void print(int num, int flag)
{
	unsigned int i;
	i = 1 << (sizeof(int)* 8 - 1);

	if (num < 0)
	{
		switch(flag)
		{
			case 0:   //对原码的处理
				num = num - 1;
				num = ~num;
				num |= i;    //设置符号位
				break;
			case 1:  //对反码的处理
				num = num - 1;
				num |= i;   //设置符号位
				break;
			default:
				break;
		}
	}

	while (i)
	{
		static int k = 1;
		printf("%c", num & i ? '1' : '0');
		if (k % 4 == 0)
			printf(" ");
		i >>= 1;
		k++;
	}
	printf("\n");
}
    


所有内容的目录

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值