原码、反码、补码的转换
数字在机器中都⽤⼆进制来进⾏存储,有符号数则有原码、反码和补码三种表⽰⽅式
这三种表⽰⽅式⾥,最⾼位都代表的是符号位,1代表负数,0代表正数
1.原码
⼀个数的原码就是该数直接转化成⼆进制得到的数字,第⼀位是符号位
+8的原码:0000 1000
-8的原码:1000 1000
2.反码
正数的反码是⾃⼰本⾝
+8的原码:0000 1000
+8的反码:0000 1000
负数反码就是原码除了符号位不动,其他所有位按位取反
-8的原码:1000 1000
-8的反码:1111 0111
3.补码
正数的补码是⾃⼰本⾝
+8的原码:0000 1000
+8的反码:0000 1000
+8的补码:0000 1000
负数的补码是反码加⼀得到的(运算时包括符号位)
-8的原码:1000 1000
-8的反码:1111 0111
-
8的补码:1111 1000
正数的原反补码都是相等的,负数的原反补码是相互转换得到的
4.补码存在的意义
在机器中,数值⼀律⽤补码来表⽰和存储。
使⽤补码的原因:
1. 使⽤补码可以将符号位和数值域统⼀处理
2. 两个数字之间进⾏加减法运算时是将数字拿到CPU中进⾏计算的,⽽CPU只有加法器,要将减法转换成加法,所以可以利⽤补码使加
减法统⼀操作
举个例⼦
计算 8 - 5
因为CPU只有加法器所以要将 8 - 5 转换成 8 + (- 5) 来计算
(+8)
8的原码:0000 1000
8的反码:0000 1000
8的补码:0000 1000
(-5)
-5的原码:1000 0101
-5的反码:1111 1010
-5的补码:1111 1011
8 - 5 = 8+(-5)
0000 1000
+1111 1011
-
----------------
负数二进制补码运算法则 0000 0011
0000 0011的符号位是0,则表⽰正数,原反补码都相同,转化成⼗进制就是3
代码测试
int main()
{
int i =8;
int j =-5;
int m = i + j;
printf("%d\n", m);
return0;
}
结果得到
我们利⽤调试看⼀下内存中存放的数据
⾸先查看 i 的地址⾥存放的数据
看到他在内存中存的是 08(这⾥是16进制)转换成⼆进制就是 0000 1000( 8 的补码)之后我们看⼀下 j 的地址⾥存放的数据
这⾥存的是 fb 转化成⼆进制就是 1111 1011(这⾥就是 -5 的补码)
所以数据在机器中以补码形式表⽰和储存,补码的出现也更加便于计算
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论