操作系统//计算机系统漫游

1.信息的表示和存储

C语言的数据类型长度会随着机器字长变化而变化,IOS C99引入了一类不随编译器和机器设置变化而变化的数据类型,如int32_t和int64_t。

进程的虚拟地址空间如下:在这里插入图片描述

在存储数据时,从低地址往高地址存储。数据右侧为最低有效字节,左侧为最高有效字节。大端法即高有效字节开始存储。小端法从低有效字节开始存储。注意都是以字节为单位正序和逆序存储的。
在这里插入图片描述
linux、Intel一般是小端存储。

二进制代码一般是不兼容的。对同一段代码,不同机器生成的编码方式不同,导致机器码也不同。

逻辑右移和算术右移:逻辑右移往左侧补0,算术右移往左端补最高有效位的值。

C和C++都支持有符号数(默认)和无符号数,JAVA只支持有符号数

2.无符号数以及补码数

无符号数和补码都具有唯一性。

在将数据扩展到更大的数据类型时,无符号数做零扩展,补码做符号扩展。
将数据截断为更小的数据类型时,从高位开始截断。截断至指定长度即可,然后按照数据类型进行解释。

检测无符号数加法溢出,如果两个无符号数相加,所得的结果小于某一个加数,那么可判定溢出。
检测补码加法溢出。如果两个补码数相加,正正得非正,发生了正溢出。负负得非负,发生了负溢出。

无符号数和补码数的求反,即阿贝尔群的逆元。都是使得原数和求反数相加,所得结果溢出从而为0.

整数乘法慢,需要10个或者更多的时钟周期,所以将乘法变成一系列移位的和以加快运算速度。比如x*3=x>>1+x>>0
整数除法慢,需要30个或者更多的时钟周期,将除法变成一系列右移。注意补码除法是算术右移。另外注意,补码除法时,正数向下舍入,复数向上舍入。所以如果补码是负数,还需要加上偏置。利用如下原理:

x/y向上取整时,在x上加上一个y-1的偏置,得到的结果即为x/y向下取整。

3.浮点数

(以下皆为IEEE标准)

3.1 规格化的值

阶码不全0也不全1,尾数隐含1,这样做是因为很容易通过调整阶码,使得尾数最高位为1,然后省略1,就获得了一个额外精度位。
阶码值是阶码的位所表示的无符号数的值减去偏移,其中偏移为2^(k-1) -1,k为阶码的位数。
尾数值为1.f,其中f为浮点中的尾数部分。

3.2 非规格化的值

阶码全0。
阶码值为1-偏移
尾数值为0.f,无隐含的1
非规格化的浮点数提供了一种表示0.0的方法。因为规格化数隐藏1的缘故,不可能表示0。
除此以外,非规格化浮点数还提供了一种表示非常接近0的数的方法。

3.3 特殊值

阶码全1。
下分两种情况:
小数域全0,表示无穷,根据符号位不同分为正无穷和负无穷。可用于表示溢出的结果,如除0。
小数域非全0,表示NAN,即非数。如根号-1,无穷相减等等。

3.4 浮点舍入

四种舍入方式:向偶数舍入,向0舍入,向上舍入,向下舍入
向偶数舍入有几种情况比较有用:
1.消除舍入的偏差。向上舍入会导致舍入后结果的平均值大于实际平均值,相反,向下舍入会导致舍入后结果平均值小于实际平均值。向0舍入会导致实际结果的绝对值小于实际平均值的绝对值。而向偶数舍入在大多数情况下有50%的向上舍入,50%的向下舍入,能消除这种偏差。
2.如果不想舍入到整数,也可以使用向偶数舍入。仅仅考虑最低有效位的奇偶即可。

3.5 浮点运算

浮点运算是不可结合的,运算过程由于舍入导致数据丢失。
大多数浮点数对于加法都有逆元,即x+(-x)=0,然而NAN和无穷没有。

C语言数据类型转换(int32,float 32,double 64),从横坐标转化为纵坐标

intfloatdouble
int不会溢出,可能被舍入,float只有25位的精度不会溢出,不会舍入,double有52位精度
float向0舍入,可能溢出C,语言没有对溢出后该是什么值的处理,与intel兼容的微处理器指定了位模式[100**0]为整数不确定来表示这种情况不溢出,不舍入
double向0舍入,可能溢出,C语言没有对溢出后该是什么值的处理,与intel兼容的微处理器指定了位模式[100**0]为整数不确定来表示这种情况可能溢出为无穷,可能舍入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值