二进制运算

补码的转换规则
负数转补码
最高位不变
剩下的所有位进行"非"操作.
结果加1
补码还原
我总结出来一个比较简单的规则
从最低位开始, 所有位都不变, 直到遇到第一个1为止
第一个1不变, 剩下的所有位取"非"操作(不包括符号位)
例子
先决条件: 8位二进制数, 最高位为符号位
11101010 转换为原码为 10010110
补码的意义
我们通过一个简单的二进制运算来了解补码的意义.
先决条件: 4位二进制数, 最高位表示符号位.
我们来算一下, 0100 + 0010 = ?
很简单, 结果是 0110.
那么, 我们在来算一下 0100 - 0010 = ?
我们知道, 计算机在进行二进制累加的时候, 只能算加法.
所以, 上边这个减法算式, 就会变成 0100 + 1010 = ?
我们来按照计算机的思维, 来算一下, 结果为 1110, 很显然, 结果错误.
那么, 我们将 1010 转换为补码形式.
1010 的补码为 1110, 我们使用补码来进行运算.
0100 + 1110 = 10010, 因为我们是4位二进制数, 舍弃最高位, 结果为 0010.
可以看到, 结果是正确的.总结: 补码的意义就是使计算机更好, 更准确, 更快速的进行累加运算.
默认规则
- 在规定长度的二进制数中, 如果最高位为1, 那么之后的二进制数为补码形式存储.
- 0 没有补码
左移和右移
左移很简单, 进行左移n位就相当于把 该数字x2的n次方 进行运算.
右移分为两种, 一种是逻辑右移, 一种是算数右移.
逻辑右移: 在逻辑上进行右移, 左边补零, 右边去掉. 原理同左移.
算数右移:
在该数为正数时, 同逻辑右移.
在该数为负数时, 左侧补1, 右侧去掉.
浮点数的存储方式

运算浮点数的时候, 想要安全的使用, 就要尽量规避小数运算.
以下是一个比较极端和理想化的场景.
示例代码, 操作浮点数, 运行结果是10吗?
int main() { float sum = 0; int i = 0; for (i = 0; i < 100; i++) { sum += 0.1; } printf("%f\n", sum); return 0; }
修改后的代码
int main() { float sum = 0; int i = 0; for (i = 0; i < 100; i++) { sum += 0.1 * 10; } printf("%f\n", sum / 10); return 0; }
作业
1.0100111001-(01110000)补码=
2.1110011001000
对该数进行逻辑右移3位的值, 使用二进制和十进制两种方式表示出结果.
对该数进行算数右移3位的值, 使用二进制和十进制两种方式表示出结果.
3.高级编程语言中的数据类型表示的是什么?
4.32位环境中,指针的长度是多少位?
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2016-10-06 at 03:00 pm


嗯, 关于浮点数加减的问题,其实这里可以做一次更新了