挑战面试编程:原码、反码、补码
来源:互联网 发布:2016年手游数据 编辑:程序博客网 时间:2024/05/20 07:36
挑战面试编程:原码、反码、补码
原码、反码、补码是关于整数在计算机中的三个概念。
在计算机中,对于整数是这样存储的,在所有的二进制位中用一位(最高位)当做符号位,约定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");}
所有内容的目录
- CCPP Blog 目录
- 挑战面试编程:原码、反码、补码
- 原码、反码、补码
- 原码-反码-补码
- 原码、反码、补码
- 原码、反码、补码
- 原码,反码,补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码补码反码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码 补码 反码
- 原码、反码、补码
- python函数参数带星号*
- 数据结构括号匹配
- 【HDU】5021 Revenge of kNN II 树状数组
- Android ProgressBar自定义图片进度,自定义渐变色进度条
- 斯坦福大学公开课:广义相对论
- 挑战面试编程:原码、反码、补码
- Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知
- 黑马程序员--详解希尔排序
- 20140920 【 线段树 — 区间覆盖,区间查询 】 2014 ACM/ICPC Asia Regional Guangzhou Online--A Corrupt Mayor's Perfor
- HttpUrlConnection使用总结
- hdu 4266 The Worm in the Apple 三维凸包
- android Intent 显示和隐示意图
- iOS8 Core Image In Swift:视频实时滤镜
- 自己实现C语言双向向链表