原码,反码,补码介绍
在计算机内,有符号的数有3种表示法:
- 原码
- 反码
- 补码
几种表示法关系密不可分。
原码
原码是计算机机器数中最简单的一种形式,分为2部分:
- 符号位:最高bit位,“0”表示正数,“1”表示负数;
- 数值位:除符号位之外的位,大小是真值的绝对值;
原码又称带符号的绝对值。为了方便整数和小数区别,整数的符号位与数值位之间用“ , ”隔开,小数的符号位与数值位之间用“ . ”隔开。
从定义看出,原码的整数和小数中“0”的表示形式各有2种,“+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000;整数的“-0”原码为1,0000000;小数的“+0”原码为0.0000000,小数的“-0”原码为1.0000000,如图:
名称 | 整数 | 小数 |
---|---|---|
+0 | 0,0000000 | 0.0000000 |
-0 | 1,0000000 | 1.0000000 |
总结:所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码
反码表示法规定:
正数的反码与其原码相同;
负数的反码符号位保持为1,数值位逐位取反
对于二进制原码10010求反码:
((10010)原)反=对正数(00010)原含符号位取反= 反码11101 (10010,1为符号码,故为负)
补码
补码表示法规定:
正数的补码与其原码相同;
负数的补码是在其反码的末位加1。
总结
正数:三码归一;
负数: 最高位符号位为1,反码是原码数值位取反,补码是反码加1。
计算机内存表示
正数在在计算机内存中以补码的方式存储,
例如(https://blog.youkuaiyun.com/weixin_41565133/article/details/87823206)
因为:
正数三码归一,所以所见即所得。
负数补码和原码之间间隔反码,所见不很直观
计算一
【求负数的内存表示】
1.求相应正数
2.按位取反
3.加1
【例】
名称 | -1 | -2 | -127 | -128 |
---|---|---|---|---|
相应正数 | 00000001 | 00000010 | 01111111 | 10000000 |
按位取反 | 11111110 | 11111101 | 10000000 | 01111111 |
加1 | 11111111 | 11111110 | 10000001 | 10000000 |
-1的存储方式(补码) | 11111111 | 11111110 | 10000001 | 10000000 |
【根据计算机内存表示求数】
1.减1
2.按位取反
3.加负号
名称 | 11111111 | 11111110 | 10000001 | 10000000 |
---|---|---|---|---|
减1 | 11111110 | 11111101 | 10000000 | 01111111 |
按位取反 | 00000001 | 00000010 | 01111111 | 10000000 |
加负号 | -1 | -2 | -127 | -128 |
计算二:
1.如果你看见了一个类似0xfffffffa怎么判断它是负几呢?很简单,用0x100000000-0xfffffffa得出来的数加个负号就是了。
2.如果想将一个int型整数取反直接使用符号“~”然后再+1即可,这个方法在效率上比使用符号块,因为是位操作,比运算符操作要快。
如:a=~a+1
三码的作用
- 原码无法解决减法的计算问题;
- 反码可以保证数值位计算正确,但是无法解决符号问题,导致有“+0”和“-0”存在;
- 补码可以同时解决计算和符号的问题,且以8位二进制为例可以用[1000 0000]表示-128。这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是:
[-2^31, 2^31]
因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
变量类型取值范围
类型 | 范围 | 范围 |
---|---|---|
char | [-2^7,2^7-1] | -128~127 |
unsigned char | [0, 2^8-1] | 0~255 |
short | [-2^15, 2^15-1] | -32768~32767 |
unsigned short | [0, 2^16-1] | 0~ 65536 |
int | [-2^31, 2^31-1] | -2,147,483,648~2,147,483,647 |
unsigned int | [0, 2^32-1] | 0~4,294,967,295 |
参考文档
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
https://www.cnblogs.com/fengxing999/p/10215938.html
https://blog.youkuaiyun.com/weixin_41565133/article/details/87823206
https://blog.youkuaiyun.com/zl10086111/article/details/8090742
https://blog.youkuaiyun.com/yangzhip123/article/details/73862928