【第 2 周】深入理解计算机系统共读心得体会

所在小组:第一组
组内昵称:bluewhale
心得体会:

  • 三种编码方式:无符号、补码、浮点数。分别对应自然数、整数、实数
  • 二进制的整数运算构成一个阿贝尔群,满足整数满足交换律、结合律等,可能溢出
  • 浮点数不一定满足交换律,结合律,因为它只是近似表示

寻址和字节顺序

多字节对象连续存储,对象的地址是所使用字节的 最小地址 。如 4 字节的 int 变量,其地址是第一个字节的地址。

大端法与小端法

按照有效 字节 在内存中的存储顺序,可以分为 大端法和小端法 :大端法从高位到低位存储,小端法从低位到高位存储。比如某个 int 型整数的值为 0x01234567,存储在 0x100~0x103 的内存地址上。

浮点数比较大小

将浮点数的位级表示看作无符号数,直接比较。负数需要简单的额外处理。

浮点运算

浮点加法不具有结合性,因为可能溢出、丢失精度。

乘法同理,可以交换,不可以结合,也不具有分配性。但是乘法运算满足 单调性 ,即只要 a、b、c≠NaN,那么如果 a≥b,就一定有 a*c≥b*c

浮点数的舍入

浮点数相当于是一种近似表示。当某个数字的有效位数超过浮点数所能表示的最大精度时,需要舍入。

舍入共分为 3 种情况:进一、舍去、向偶数舍入。具体采用哪种舍入规则,是根据被舍掉的位与 中间值 的大小关系确定的。

中间值:先以十进制为例。比如 5.23500,保留两位小数。那么中间值就是 XX.YY50000…0,即第三位是 5,之后全是 0。

按照浮点数的舍入规则,5.23500 被舍掉的位 等于 中间值,需要向偶数舍入,得到 5.24;5.23510 被舍掉的位 大于 中间值,需要进一,得到 5.24;5.23410 被舍掉的位 小于 中间值,需要舍去,得到 5.23。

所在小组
第七组
组内昵称
Hayden
心得体会

  • 首先对于任何数据都有范围有了新的体会,数据相加和想乘要注意不要溢出,编码过程中要注意数据溢出bug,错误容易出现且很难查找。

  • 原码、反码、补码是计算机编码的三种方式。反码是为了解决减法问题而产生的,但是反码表示0有两种编码方式,于是便诞生了补码,正数的补码等于本身,负数的补码等于反码加1。计算机中只能存储0与1,计算机的加减乘除通过与、或、非异或来实现,在计算机设计逻辑电路高低电位分别代表0与1也比较好设计。

  • 按照有效 字节在内存中的存储顺序,可以分为 大端法和小端法 :大端法从高位到低位存储,小端法从低位到高位存储,在不同的系统中,可能存在不同的存储方法,在网络编程过程中,网络传输也要注意大小端问题。

  • 浮点数只能无限接近,不一定能存储准确的值,计算机中只能存储0和1,比如1/3只能无限接近,在支付系统中一定要注意精度,可能会存在精度丢失问题。

所在小组

 第2组

组内昵称

心得体会

1.信息在计算机中的表达:

底层:0 和 1 表示
逻辑:有符号数、无符号数、原码 和 补码

2.简单了解:整数、浮点数,实现原理和程序中运算规则。在后续开发中要注意不同类型的数,在发生转换时、运算时的形式(计算机中),尽量避免由于数的某些错误而导致整个程序产生比较奇怪的结果

例如:结算业务中的使用了浮点数(大数)进行乘法运算,就会导致精度丢失发生资金损失(计算错误)

3.程序开发中,要注意和避免溢出,做好边界条件校验

溢出是什么:就是水杯只能装100ml水,超出就漫出来了

溢出的危害:程序崩溃、结果错误,还可能被利用,然后运行恶意代码

所在小组:第三组
组内昵称:Hector
心得体会:本周忙于转正,国庆有时间还得在仔细读一读~

第 2 章 信息的表示和处理

第 2 章主要讲述了如何在计算机上表示信息、处理信息等。在日常开发中使用数据时,要格外注意数据的类型和范围,还要考虑跨平台性,防止代码出现一些奇奇怪怪的bug。

2.1 信息存储

  • 计算机可能没有产生预期等结果,但是至少它是一致的。
  • 二进制、十进制、十六进制的表示及转化。
  • 位运算(~、&、|、^) 与逻辑运算( ||、&&、!)
  • 移位运算:左移、右移(逻辑右移、算术右移)

2.2 整数表示

  • 三种编码方式:原码、反码、补码。
  • 原码转补码:对于零和正数,原码与补码相同;对于负数,原码符号位不变,其余取反,最后再加一。

2.3 整数运算

  • 可以通过位运算来提升代码的运行效率。

2.4 浮点数

  • 浮点数的表示由符号S、尾数M、阶码E三组成。
  • 浮点数的表达不是准确的,日常开发中应注意这一点。

所在小组

第七组

组内昵称

Jinmiao Luo

你的心得体会

知道了单精度和双精度具体的实现规范

一段自己的阐述

我习惯了更新到 GitHub MarkDown 的方式.

阅读请见:
第二周阅读

所在小组

第 2 组

组内昵称

叶王

你的心得体会

  • 第二章讲信息的表示和处理,主要讲了信息存储,整数和小数的表示和运算。
  • 字节是计算机寻址的最小单位,而不是位。地址一般使用16进制数表示(0x或0X,后跟 0-9,以及 a-f,不区分大小写)
  • 字节有顺序,最低有效字节在低位地址,是小端法,反之是大端法。我们一般电脑都是Intel处理器,都是小端法。IBM和Sun的一些计算机采用大端法。
  • 整数表示分为补码,原码,反码。计算机主要采用补码。
  • 有符号与无符号数之间的转换,有可能产生正反溢出,编码的时候需要注意。
  • 浮点数在相同字长时,表示的数的范围远大于整数,相应的,精度做了牺牲。
  • 第二章整体很多细节,时间有限,后面还需要多看几遍,第二章最后有很多习题,也需要补充。

所在小组:第三组
组内昵称:晴天
心得体会:

  1. 有符号数与无符号数之间的强制类型转换,结果保持位值不变,但改变了解释位的方式。比如-12345和53191
  2. 整数使用补码的方式编码,浮点数采用IEEE标准754编码。
  3. 任何数据都有范围,取决于字长。相同长度的有符号与无符号的强制类型转换,底层的位模式不变。
  4. 浮点数只能无限地接近,增加二进制的长度能够提高表示的精度,不过也是近似地表示,计算时需要注意精度的问题,不然会吃大亏。IEEE标准754真是伟大的创造
  5. 抽时间慢慢把章节中的习题补上
  1. 所在小组:第二组
  2. 组内昵称:跃山
  3. 心得体会:https://www.yuque.com/docs/share/6dab5288-d25c-4a19-af0e-552a29f04ce0#69979f89
  1. 所在小组:第三组
  2. 组内昵称:uucloud
  3. 心得体会:

2.2 整数表示

  • 无符号数编码是一个双射,即y = f(x),x=f^-1(y)。每一个无符号数都对应唯一一个二进制的映射。
  • 补码:最高位是负权,也称为符号位。补码编码也是双射。
  • c语言中,无符合好和补码的强制类型转换只是解释位的方式不同了,所以对于负权为0的无符号和补码是一致的,但是反之需要转换,加上或者减去一个最高位的二进制大小。c有隐式转换,这里容易出坑,比如 int(-1) < unsigned int(0) == false,因为int(-1)的无符号其实是最大的unsigned int。感觉没有必要记这个转换的逻辑,比较好的方法是,不要拿不同类型的数值做比较,也不要做这种隐式类型转换。
  • 位扩展:无符号的很简单,直接往上添0就好。补码是添原来最高位一致的位(好像填上了算术右移那里埋的坑?)。

2.3 整数运算

  • 一个检测无符号加法溢出的简单方法:x+y < x
  • 补码加法溢出的检测方法:x>0 y >0, s ≤0 或 x<0,y<0,s≥0
  • 大多数机器上,整数乘法指令要十个或更多的时钟周期,其他整数运算(加减法,位运算和位移)只要1个,所以乘常数的时候,可以转换成乘2的幂,改成位运算来加速。除法比乘法更慢,所以同样可以将整数除法转换为算术右移。

2.4 浮点数

  • 舍入(rounding)有一种向偶数舍入,因为向上和向下舍入都会造成偏大或偏小,而向偶数舍入可以避免统计误差。

尚义龙:尚义龙的第二周总结
史素佳:史素佳的第二周总结
安梦飞:安梦飞的第二周总结
张旭辉:张旭辉的第二周总结
顾思明:顾思明的第二周
卢国华:卢国华的第二周总结
魏琮:魏琮的第二周总结
志林:暂无

静默组
helloLinux

  • 在实际编码过程中,对于类似c语言的memcpy,strcpy等函数,特别需要考虑非法访问,有时候不一定会崩溃,但是会对系统运行产生严重影响。
  • 对于汇编而言,需要了解代码实际是怎样运行的,内部堆栈是怎么样的。
  • 对于go也是一样的。

所在小组

第 2 组

组内昵称

陶鑫

你的心得体会

  • 几乎所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的
  • 整型数据类型:char、short、long、int32_t、int32_t(对应的还有unsigned)
  • 负数的范围比正数的范围大1
  • 无符号数编码的定义
    B2U4([1011])=8+0+2+1=11
  • 补码编码
    B2T([1011])=-8+0+2+1=-5
  • 整数表示分为补码,原码,反码。计算机主要采用补码。
  • 有符号与无符号数之间的转换,有可能产生正负溢出,编码的时候需要注意。
  • 检测补码加法中的溢出,x>0,y>0而s<0
  • 整数乘法比移位和加法的比较要大的多。x*14,编译器会将乘法重写为(x<<3)+(x<<2)+(x<<1),将一个乘法替换为三个移位和两个加法,更好的算法是(x<<4)-(x<<1),只需要两个移位和一个减法。
  • 对浮点数执行运算的细节,常常不会太多的关注运算的精确性,而把实现的速度和简便性看得比数字精确性更重要。
    单精度浮点格式float s、exp、frac字段分别为1位、k8位、和n=23位
  • 第二章描述的不是很清楚,感觉不够深入,可能和习题没做有关,争取把习题都做了,好好理解文中的意思。

所在小组

第 2 组

组内昵称

李显良

第二章 信息表示和处理

整数表示

java中只有有符号整数
  1. c中含有无符号整数、有符号整数
  2. 默认有符号整数会转换成无符号整数
  3. 整数转换过程中bit不会发生变化

整数运算

  1. 二进制补码加法 溢出会进行截断

浮点

  1. 舍入 浮点都是近似求职
  2. 浮点表示通过将数字编码来近似的表示实数

所在小组

第五组

组内名称

李锦锐

Chapter 2 -Notes

This section is mainly talking about how to represent and manipulate information. And it reveals the relationship between the representation of bits and the implementation of bits . The most important things the author want us to figure out is that casting between signed and unsigned number of different data size.

there is a few key points .

Information storage

Most Computer use blocks of eight bits, or bytes. Bit operation do not subject(obey) to common mathematical properties, such as associativity, commutativity, and distributivity, which allows compiler to do many optimizations.

two-conventions:

  • Addressing
  • Byte Ordering

ordering becomes issues

  • when a binary data are communicated over a network between different machines.
  • when looking at the byte sequences representing integer data, like inspecting machine-level programs.
  • where byte ordering becomes visible is when programs are written that circumvent the type system.

Integer Representations

Aside

  • The binary notation is too 【verbose】, while with decimal notation, it is tedious to convert to and from bit patterns.
  • Programmers should strive to make their programs portable across different machines and compilers.

Reference

所在小组

五组

组内名称

陈松彬

Chapter2

Author: @陈松彬

Date: 2020-09-27

一、为什么是补码

书上提到:对于有符号数的编码方式有多种,常用的是补码,另外还有原码和反码。

那为什么各大厂商的实现都选择了补码呢?我们可以分别分析一下几种编码方式

  • 原码:用一个最高位来代表符号位,非常符合人类的认知,但是参与计算的是计算机。比如在处理加法的时候,需要额外考虑符号位,增加了复杂度
  • 反码:同样使用一个最高位来表示符号,对于数值的部分进行取反操作,这样对于数值0有两种表示形式,造成了浪费(考虑w=4,0有两种表示「0000」或者「1000」)
  • 补码:最高位w的权值设为2^(w-1) 解决了上面两种方式的缺点,对于符号位也参与运算(比如符号位加法,也像普通数值一样相加进1),实现起来方便。

二、类型转化

  • 强制类型转化,这个由于是编写代码的人显示指定的,一般都会认真思考会不会有什么问题。
  • 隐式类型转化,一般往往容易出现bug

三、随想

这一章比较偏数学理论,再次感受到了数学这一门学科的严谨。从中我觉得平时阐述想法,也可以学习这一种严谨的形式:

(1)先列举几个例子

(2)给出了各种符号的定义,给出结论

(3)最后结论推导

同时我觉得一个科学的发现流程应该是这样:发现规律 → 大胆猜测 → 实验验证(公式推导)→ 用数学符号严谨阐述自己的观点(形成论文)

四、

所在小组

五组

组内名称

张学广