vps搭建vpn无法访问国内网站,公司排名100强,搜房网房天下官网,商标设计费用一般是多少1. 原码
原码就是符号化的数值#xff0c;其编码规则简单直观#xff1a;正数符号位用0表示#xff0c;负数符号位用1表示#xff0c;数值位保持不变。
x0.1101#xff0c;则[x]原0.1101#xff1b;x1101#xff0c;则[x]原01101x -0.1111#xff0c;则[x]原1.1111其编码规则简单直观正数符号位用0表示负数符号位用1表示数值位保持不变。
x0.1101则[x]原0.1101x1101则[x]原01101x -0.1111则[x]原1.1111 x -1111则[x]原11111但原码存在两个机器0这会给数据运算带来麻烦。另外原码的加减法运算复杂符号位不能直接参与运算。加法运算需要“同号求和异号求差”减法运算需要“一号求和同好求差”求差时还需要先比较大小然后用大数减去小数最后结果的符号选择也相对复杂。显然利用原码作为机器数在实现加减法运算方面是不方便的原码在计算机中目前仅仅用于表示浮点数的尾码。
2. 反码
反码又称1的补码其符号位和原码相同真值为正数时反码和原码相同真值为负数时反码数值位为真值数值位取反。现代计算机中并没有采用反码进行数据表示和运算这是因为人们找到了更好的编码——补码。 x0.1101则[x]反0.1101x1101则[x]反01101 x -0.1111则[x]反1.0000x -1111则[x]反100003. 补码 在计算机中一个如果n bit 为且需要表示正负数那么 表示的范围是从 -2^n-1 ~ 2^n-1 -10就是用全0表示。负数能比正数多表达一个是因为在计算机中负整数是用补码表示的。所以非常适合采用补码进行表示和运算。例如
对于正整数
正整数的原码和补码相同。
对于负整数
当原码为全1的情况如下 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111-2147483647原码 1000 0000 | 0000 0000 | 0000 0000| 0000 0000 -2147483647反码 1000 0000 | 0000 0000 | 0000 0000| 0000 0001 -2147483647补码
由于计算机中是用补码进行计算的所以最小负整数-2147483648补码可以表示为 1000 0000 | 0000 0000 | 0000 0000| 0000 0000 那么其原码和反码理论上是存在的加上第一位符号位但是32位是无法存储的。但计算机中由于直接用补码进行计算所以可以存储其补码 x0.0101则[x]补0.0101x -0.0101则[x]补1.1011x -0.0000则[x]补0.0000x -1.0000则[x]补1.0000对于 零 此外还有两种情况没有包含进去 0 0000 0000 | 0000 0000 | 0000 0000| 0000 0000 原码、反码和补码匀为同一个 即整数为0这种情况在二进制中0的反码可以表示为-0和0这两种情况 -0 1000 0000 | 0000 0000 | 0000 0000| 0000 0000 原码 即-0反码表示为 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111 -0补码为反码加1则补码为 1 0000 0000 | 0000 0000 | 0000 0000| 0000 0000 第一位1舍去即 0000 0000 | 0000 0000 | 0000 0000| 0000 0000所以0和-0的补码是一样的由此可见计算机为什么会使用补码进行计算。 4. 移码
移码只用于定点整数的表示通常用于表示浮点数的阶码。其编码方式是直接将真值x加一个常数偏移量。 移码的符号位中0表示负数1表示正数
5. 溢出
程序验证
最后来考虑如果取int的值超过这个范围的情况以下为程序来验证
#includeiostream
using namespace std;
int main()
{int i2147483647;int j2147483648;int k2147483649;coutiendl;coutjendl;coutkendl;return 0;
}从上图输出结果来看可以看到一个很有趣的结果当正整数超出2147483647范围后出现了循环取值的现象即2147483648溢出后回到了最小负整数-21474836482147483649溢出后变成了-21474836481-2147483647依次类推。 所以2147483649可以表示为-214748364811000 0000 | 0000 0000 | 0000 0000 | 0000 0000 0000 0000 | 0000 0000 | 0000 0000 | 0000 0001 1000 0000 | 0000 0000 | 0000 0000 | 0000 0001 所以int整型溢出后可以用这样的方式类推。 6. 快速计算某个补码的数值2个方法 1把符号位也用于计算2翻转后加上负号如下图 再举一个例子1010是一个补码计算-82 -6就是-6的补码。
或者 翻转为0101等于6再加上负号为-6. 7. 快速判断两个补码相加可能会
如果两个正数相加或负数相加则可能会溢出如果两个数的符号为一个为0一个为1则不会溢出。因此关键是看符号位。
8. practice