深入理解计算机系统 第2章 信息的表示和处理
作者:互联网
位
十六进制 hex
四个 二进制一组
字长
指明指针数据的标称大小。虚拟地址是以这样一个字来编码
int32_t和int64_t ,分别为4个字节和8个字节
大部分数据类型都编码为有符号数值。数据类型char是一个例外。尽管大多数编译器和机器将它们视为有符号数,但C标准不保证这一点。
小端法 在内存中按照从最低 有效字节到最高有效字节的顺序存储对象
大端法 从最高有效字节到最低有效字节的顺序存储
0x1234567
Intel兼容机只用小端模式。IBM Oracle大多数是大端。 较新的处理器是双端法。Arm是双端法,Android iOS 只运行小端模式
问题
1.大小端机器通信
2.阅读表示整数数据的字节序列
3.强制类型转换 联合
布尔代数
加法逆元
x+(-x) = 0
x^x = 0
a ^ b ^ a = b
位向量
a=[01101001]表示集合A={0, 3, 5, 6)
5=[01010101]表示集合B={0, 2, 4, 6}
A n B={0, 6}
|| && !
只有参数限制为0/1才与对应逻辑运算有相同行为
如果第一个参数可以确定表达式,就不会对第二个求值
移位运算
C语言标准并没有明确有符号使用哪种类型右移 算数 逻辑。几乎所有编译器都对有符号数算数右移
Java x>>k x算数右移 x>>>k x逻辑右移
w位 移动k位 k>=w 位移量为k mod w
C语言没有保证,Java保证
1<<2+3<<4本意为(1<<2)+(3<<4)实际1<<(2+3)<<4 加法优先级比移位要高
整数
B二进制 T补码 U无符号
无符号数编码的唯一性。B2UW是一个双射。
补码编码的唯一性。B2TW是一个双射。
补码的范围是不对称的:|TMin| = |TMax| + 1
<limits.h> 定义了常量INT_MAX INT_MIN UINT_MAX
C语言标准并没有要求用补码来表示有符号整数。Java要求
O反码
S原码
处理同样字长的有符号数和无符号数之间相互转换的一般规般规则是:数值可能会改变,但是位模式不变
要创建一个无符号常量,必须加上后缀字符’U,或者’u’,例如,12345U 或者 0xlA2Buo
有符号数 与 无符号数运算,将有符号数强制转换为无符号数
无符号数的零扩展
u’=[0,…,0 , u w-1 , u w-2 ,…,u0]
补码数的符号扩展
x’ = [ x w-1, … , x w-1, x w-2, … x0 ]
截断无符号数
截断k位 x’ =x mod 2k
截断补码
x’ = U2Tk(x mod 2k)
无符号数加法
无符号数求反
补码加法
补码的非
无符号数乘法
补码乘法
用移位和加法运算的组合来代替乘以常数因子的乘法
假设一个程序包含表达式x * 14。利用 14 = 23 + 22 +21 。(x«3) + (x«2) + (x«1 )
x*K K可以写成[(0…0)(1…1)(0…0)…(1…1)]的二进制序列
形式 A: (x«n) + (x<<(n-1)) ------ (x«m)
形式 B: (x«(w + l)) — (x«m)
除法
对于x>=0、y>0,结果会是|_ x / y _|
对于x < 0 y > 0 结果会是|- x/y -| 上取整
(余数为正)
除以2的累的无符号除法
x»k产生数值|_x/2k」
(x+ (1«k) - 1) »k产生数值Lx/2k」
浮点数
s符号 M尾数 E阶码
k = 4 bias = 7 E = -6 M = 7/8 V = 7/512
E = -6 M = 1 V = 1/64 = 8/512
k = 4 bias = 7 E = -7 M = 7/8 V = 7/1024
E = -7 M = 1 V = 1/128 = 8 /1024
规格化的值
E = e-Bias e是无符号数 Bias是 2k-1-1
0<= f <1 0.fn-1… f1 f0;M=1+f
非规格化的值
E = 1 - Bias M = f
+0.0浮点表示位模式全0;可以表示非常接近0.0的数:逐渐溢出
特殊值
小数域全为0时,得到的值表示无穷,当S = 0时是+无穷,或者当S=1时是-无穷
小数域非零,为NaN
最大非规格化数7/512和最小规格化数8/512之间的平滑转变。这种平滑性归功于我们对非规格化数的E的定义。通过将E定义为1 —Bias,而不是— Bias,我们可以补 偿非规格化数的尾数没有隐含的开头的1(8位浮点数)
它们就是按升序排列的,就像它们表示的浮点数一样。
舍入
默认:向最接近值舍入 向偶舍入。当为.5,则向偶舍入。当其他则向最近舍入
向零舍入 向上舍入 向下舍入产生实际值的确界
向零舍入
向下舍入
向上舍入
x +f y将定义为Round(x+y)
可交换的
不可结合的
单调性:a>=b a+x>=b+x
C语言标准不要求机器使用IEEE浮点,所以没有标准的方法来 改变舍入方式或者得到诸如一0、+8、一8或者NaN之类的特殊值。
GNU编译器GCC会定义程序常数INFINITY(表示+8)和NAN(表示NaN)
从int转换成float,数字不会溢出,但是可能被舍入。
从int或float转换成double,因为double有更大的范围(也就是可表示值的范 围),也有更高的精度(也就是有效位数),所以能够保留精确的数值。
从double转换成float,因为范围要小一些,所以值可能溢出成+8或一8。另
外,由于精确度较小,它还可能被舍人。
从float或者double转换成int,值将会向零舍入。例如,1.999将被转换成1,
而一1. 999将被转换成一1。进一步来说,值可能会溢出。C语言标准没有对这种情 况指定固定的结果。与Intel兼容的微处理器指定位模式[10-00](字长为w时的 TMin w)为整数不确定(integer indefinite) 一个从浮点数到整数的转换,如果不 能为该浮点数找到一个合理的整数近似值,就会产生这样一个值。因此,表达式 int)+1e10会得到-21483648,即从一个正值变成了一个负值。
标签:舍入,计算机系统,规格化,符号,浮点数,补码,理解,深入,字节 来源: https://blog.csdn.net/weixin_43627561/article/details/113027935