1)原码:一个数的原码(原始的二进制码)有如下特点:
- 最高位做为符号位,0表示正,1表示负
- 其它数值部分就是数值本身绝对值的二进制数
- 负数的原码是在其绝对值的基础上,最高位变为1
- 原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算
eg:char ch=10//char类型在内存中占1个字节,8位
原码:0000 1010//2^3+2^1
char ch1=-10
原码1000 1010
2)反码
- 对于正数,反码与原码相同
- 对于负数,符号位不变,其它部分取反(1变0,0变1)
- 反码运算也不方便,通常用来作为求补码的中间过渡
eg:char ch=10//char类型在内存中占1个字节,8位
原码:0000 1010
反码:0000 1010
char ch1=-10
原码:1000 1010
反码:1111 0101
3)补码
- 对于正数,原码、反码、补码相同
- 对于负数,其补码为它的反码加1
- 补码符号位不动,其它位求反,最后整个数加1,得到原码
- 在计算机系统中,数值一律用补码来存储
eg:char ch=10//char类型在内存中占1个字节,8位
原码:0000 1010
反码:0000 1010
补码:0000 1010//十六进制为0a
在内存中以十六进制0a进行存储,一个单元格表示1个字节,8位
char ch1=-10
原码:1000 1010
反码:1111 0101
补码:1111 0110//十六进制为f6
4)计算机系统中,数值一律用补码来存储,主要原因是:
- 统一了零的编码
//0在计算机中存储的方式:ina a=0; int b=-0;
0000 0000 1000 0000
为了统一0的编码,计算机中没有-0的概念
- 将符号位和其它位统一处理//在数据计算中,符号位也参与程序的计算
- 将减法运算转变为加法运算//计算机只会算加法10+(-10)
- 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
ch-ch1=0; ch补码:0000 1010
10+10 ch1补码:1111 0110
=1 0000 0000//最高位(符号位)有进位,则进位被舍弃
=0000 0000
eg:76-32 =44 76原码:0100 1100 76反码:0100 1100 76补码:0100 1100
76+(-32) -32原码:1010 0000 -32反码:1101 1111 -32补码:1110 0000
=1 0010 1100//舍去
补码=0010 1100//如果符号位发生变化,数的值也发生变化
反码:0010 1100
原码:0010 1100=44
eg:76-82 =-6 76原码:0100 1100 76反码:0100 1100 76补码:0100 1100
-82原码:1101 0010 -82反码:1010 1101 -82补码:1010 1110
补码=1111 1010
反码:1111 1001
原码:1000 0110=-6
数值不能超过127,否则数据溢出