《深入理解计算机系统》chapter2读书笔记

2.1

2.1.6 bool代数简介

  • not ~
  • and &
  • or |
  • exclusive-or ^

我们可以将四个bool运算扩展到位相量的运算
`a = [a_w-1, a_w-2, a_w-3 … a_0],
b = [b_w-1, b_w-2, b_w-3 … b_0],
则a&b_i = a_i & b_i



bool环
a^a = 0, 即每个元素的异或逆元是其本身



通过指定一个位相量掩码,有选择地使能或屏蔽一些信号
若第i位为1,表示i信号有效;为0,则无效。因此,该掩码表示设置为有效信号的集合。


2.1.7 c语言中的位级运算

  • 位级运算的常见用法就是实现掩码运算
  1. x的最低有效字节,其他位置均为0
    x = x & 0xff
  2. x的最低有效字节设为1,其他字节保持不变
    x = x | 0xff
  3. 最低有效字节不变,其余字节取补
    x = x ^ (~0xff)
  4. 通过bis,bic指令实现 | 和 ^ 运算
    bis = x | y
    bic = x & (~y)
int bool_or(int x, int y)
{
        int result = bis(x, y)
        return result
}
int bool_xor(int x, int y)
{
           int result = bis(bic(x, y), bic(y, x))
           return result
}

2.1.8 c语言中的逻辑运算

  • &&
  • ||
  1. 逻辑运算认为非0值表示TRUE,0表示FALSE。返回1,表示TRUE,返回0,表示FALSE。只有当参数限制位0和1时,位级运算和逻辑运算有相同的行为
  2. 如果对第一个参数求值就能确定表达式结果,那么逻辑运算符不会对第二个参数求值。例a&&5/a不会出现被0整除的错误。

  • 判断语句x == y等价于!(x ^ y)

2.1.9 c语言的移位运算

  • 左移k位 x<<k 右侧bu’ling

  • 右移k位 x>>k

    1. 逻辑右移 左侧补零
    2. 算数右移 左侧补k个最高位有效值

    通常,对于有符号数的右移为算数右移;而对于无符号数,右移必须是逻辑的。Java中,使用>>>对数据进行逻辑右移,使用>>进行算数右移


  • 加法优先级高于移位运算


对于一个由w位组成的数据类型,移动k>=w位,移位量通过计算k mod w 得到。这种行为对于c语言来说是没有保证的。


2.2 整数表示

2.2.1 整数数据类型

p42 图2-9 2-10 2-11

  • 32位的机器 1 2 4 4
  • 64位的机器 1 2 4 8
  • c语言 1 2 2(4) 4

c语言默认有符号数,支持无符号数;Java只支持有符号数


2.2.2 无符号数的编码

Binary to Unsigned( B 2 U w B2U_w B2Uw)
B 2 U w ( x ⃗ ) = ∑ i = 0 w − 1 x i ∗ 2 i B2U_w(\vec x) = \sum_{i=0}^{w-1}{x_i*2^i} B2Uw(x )=i=0w1xi2i


B 2 U w B2U_w B2Uw的唯一性,该函数是一个双射函数,反函数为 U 2 B w U2B_w U2Bw


2.2.2 补码编码

  • 将最高有效位解释为负权
    Binary to Two’s-complement( B 2 T w B2T_w B2Tw)
    B 2 T w ( x ⃗ ) = − x w − 1 ∗ 2 w − 1 + ∑ i = 0 w − 2 x i ∗ 2 i B2T_w(\vec x) = -x_{w-1}*2^{w-1} + \sum_{i=0}^{w-2}{x_i*2^i} B2Tw(x )=xw12w1+i=0w2xi2i

B 2 T w B2T_w B2Tw的唯一性,该函数是一个双射函数,反函数为 T 2 B w T2B_w T2Bw



T m i n w = − 2 w − 1 Tmin_w = -2^{w-1} Tminw=2w1
T m a x w = 2 w − 1 − 1 Tmax_w = 2^{w-1} - 1 Tmaxw=2w11
U m a x = 2 ∗ T m a x w + 1 Umax = 2*Tmax_w + 1 Umax=2Tmaxw+1


  • -1和Umax有相同的位表示,一个全1的串
  • c语言并未要求使用补码表示有符号数,但几乎所有机器上都是这么使用的,故为了程序的可移植性,尽量不要采取其他表示方法。
    java要求使用补码表示,同时,java中的单个字节数据类型为byte,而非char。
  • c库中的文件<limits.h>定义了INT_MAX、INT_MIN、UINT_MAX来限定编译器运行的这台机器上的整形数据类型的取值范围。分别对应 T m a x w 、 T m i n w 、 U m a x w Tmax_w 、Tmin_w、 Umax_w TmaxwTminwUmaxw
  • <stdin.h>引入确定大小的整数类型类intN_t和uintN_t,对应着一组宏INTN_MAX、INTN_MIN、UINTN_MAX,对应其最大值和最小值

for example

printf("x = %"PRId32", y = %"PRId64"", x, y);
编译64位程序时,宏PRId32展开为字符串"d",PRId64展开为字符串"l"和"u",当c预处理器遇到空格分隔的两个字符串时,将它们串联起来。
printf("x = %d, y = %lu", x, y);
使用宏可以保证,无论代码是怎么编译的,都可以生成正确的格式字符串


有符号数的其他表示

  • 反码表示(Binary to Ones’ comeplement) B T O w BTO_w BTOw
    B 2 O w ( x ⃗ ) = − x w − 1 ∗ ( 2 w − 1 − 1 ) + ∑ i = 0 w − 2 x i ∗ 2 i B2O_w(\vec x) = -x_{w-1}*(2^{w-1}-1) + \sum_{i=0}^{w-2}{x_i*2^i} B2Ow(x )=xw1(2w11)+i=0w2xi2i
  • 原码表示(Binary to Sign-magnitude)
    B 2 S w ( x ⃗ ) = − ∑ i = 0 w − 2 x i ∗ 2 i B2S_w(\vec x) =-\sum_{i=0}^{w-2}{x_i*2^i} B2Sw(x )=i=0w2xi2i
    缺陷:对于0有两种不同的表示方法
    +0 [0, 0, 0, 0, 0]
    -0 [1, 0, 0, 0, 0] [1, 1, 1, 1, 1]


注:最高位为1

  • 已知x的补码,求x
    B 2 T w ( x ⃗ ) = − ( 2 w − ∑ i = 0 w − 1 x i ∗ 2 i ) B2T_w(\vec x) = -(2^w - \sum_{i=0}^{w-1}{x_i*2^i}) B2Tw(x )=(2wi=0w1xi2i)
  • 已知x的反码,求x
    B 2 T w ( x ⃗ ) = − ( 2 w − 1 − ∑ i = 0 w − 1 x i ∗ 2 i ) B2T_w(\vec x) = -(2^w - 1 - \sum_{i=0}^{w-1}{x_i*2^i}) B2Tw(x )=(2w1i=0w1xi2i)
  • 已知x,求-x的补码位
    2 w − x 2^w - x 2wx
  • 已知x,求-x的反码位
    2 w − 1 − x 2^w - 1 - x 2w1x

2.2.4 有符号数和无符号数的¥¥转换

  • 补码转换为无符号数 T 2 U w T2U_w T2Uw
    对于满足 T M i n w < = x < < = T M a x w TMin_w<=x<<=TMax_w TMinw<=x<<=TMaxw的x而言

    T 2 U w ( x ) = { x + 2 w x < 0 x x > = 0 T2U_w(x) = \begin{cases} x + 2^w &x<0\\ x &x>=0\\ \end{cases} T2Uw(x)={ x+2wx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值