读书笔记:《深入理解计算机系统》 之 第二章 信息的表示和处理(下)

本文关键词

整数,位移运算,浮点数,信息存储。

在计算机的数值表示中,有两种形式比较重要,一种是整数,一种是浮点数。

计算器用这些数字进行算术运算。

首先谈一下整数,整数分为无符号数,有符号数。

无符号数顾名思义只有0和正数。而有符号数则是第一位用来表示符号,所以相同字节下范围就比无符号数小。

C语言支持无符号数和符号数。而Java只支持有符号数,并且用补码进行表示。

那什么是补码呢?

首先在计算机中,机器存储数据的编码方式可以分为原码,补码,反码三种。

一般我们程序中都用补码来表示数值,因为补码的第一位用来表示符号。

计算机通过这三种码进行二进制的计算。

在二进制中除了加减法,还有一种陌生有熟悉的操作,叫做位移运算。

我们为什么要进行位移运算?

用肯定是有用的。

举个例子,在运算中特别是乘法和除法效率特别慢,对此编译器使用移位和加法运算组合来代替,会使效率变高。

其他还有很多场景。  可以参考 https://www.zhihu.com/question/38051371

说到位移,再谈一谈算术右移和逻辑右移。

汇编语言中的逻辑右移(LSR)是将各位依次右移指定位数,然后在左侧补0,算术右移(ASR)是将各位依次右移指定位数,然后在左侧用原符号位补齐。

在Java中对右移有明确的规定,x>>k表示x算术右移k个位置,而x>>>k会对x做逻辑右移。

无符号数和有符号数进行运算时会先转化成无符号数进行运算,所以有时候会造成一些溢出或者数值似乎看起来不合理的情况。

然后浮点数也存在计算不精确的问题,所以在数据库保存小数时,推荐使用Decimal,而不是使用float和double,因为他们俩在存储时存在精度损失的问题。而如果像银行这种要求十分精确的金融数额,可以用最小单位分来进行保存。

而关于浮点数,我们了解他的运算规则,就可以知道为什么有时候计算结果与期望值不一样。

以单精度为来例,它有32位,由符号位(即正负) + 阶码位(即指数) + 尾数位(有效数字)组成。

浮点数计算时,需要通过对阶,尾数求和规格化三步操作后,再将操作后的这三位组合起来得到计算结果。

再谈一谈计算机的信息存储。

计算机系统中的一个基本概念,从机器的角度来说,程序仅仅只是字节序列。

那么字节序列如何存储呢?

存储自然是存储在内存地址上。

而存储又有两种存储顺序。

一种是大端法,即在内存中,按照最高有效字节到最低有效字节的顺序存储。

一种是小端法,即在内存中,按照相反的方法进行顺序存储。

大多数Intel兼容机都只使用小端模式,而IBM和Oracle的大多数机器使用大端法,但是他们制造的个人计算机使用Intel兼容的处理器,使用小端法。

参考资料

《码出高效》第一章

发布了41 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ScanQ/article/details/100841971
今日推荐