Lesson02 PoEdu培训第一课 计算机科学篇(2) 二进制运算
文章类别: 培训笔记 1 评论

Lesson02 PoEdu培训第一课 计算机科学篇(2) 二进制运算

文章类别: 培训笔记 1 评论

二进制运算

二进制运算

补码的转换规则

负数转补码

最高位不变

剩下的所有位进行"非"操作.

结果加1

补码还原

我总结出来一个比较简单的规则

从最低位开始, 所有位都不变, 直到遇到第一个1为止

第一个1不变, 剩下的所有位取"非"操作(不包括符号位)

例子

先决条件: 8位二进制数, 最高位为符号位

11101010 转换为原码为 10010110

补码的意义

我们通过一个简单的二进制运算来了解补码的意义.
先决条件: 4位二进制数, 最高位表示符号位.
我们来算一下, 0100 + 0010 = ?
很简单, 结果是 0110.
那么, 我们在来算一下 0100 - 0010 = ?
我们知道, 计算机在进行二进制累加的时候, 只能算加法.
所以, 上边这个减法算式, 就会变成 0100 + 1010 = ?
我们来按照计算机的思维, 来算一下, 结果为 1110, 很显然, 结果错误.
那么, 我们将 1010 转换为补码形式.
1010 的补码为 1110, 我们使用补码来进行运算.
0100 + 1110 = 10010, 因为我们是4位二进制数, 舍弃最高位, 结果为 0010.
可以看到, 结果是正确的.

总结: 补码的意义就是使计算机更好, 更准确, 更快速的进行累加运算.

默认规则

  1. 在规定长度的二进制数中, 如果最高位为1, 那么之后的二进制数为补码形式存储.
  2. 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位环境中,指针的长度是多少位?

如有错误,请提出指正!谢谢.

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

    回复