CSAPP -- 信息的表示和处理

1.信息存储

  • 大多数计算机使用8位的块,或者字节,作为最小的可寻址的存储器单位,而不是在存储器中访问单独的位。
  • 当值x是2的非负整数n次幂时,x的二进制表示就是1后面跟n个0。当n表示成i+4j的形式时,其中0<=i<=3,我们可以把x写成开头为1(i=0)、2(i=1)、4(i=2)、8(i=3),后面紧跟着j个0的十六进制数比如x=2048=2^11。有n=3+4*2。从而得到十六进制表示为0x800
  • 每台计算机都有一个字长,指明整数和指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定虚拟地址空间的最大大小。也就是说,对于一个字长为w位的机器而言,虚拟地址范围为0-2^w-1
  • (a^b)^a = b
    可使用以上性质进行两数的交换
    y = x^y;
    x = x^y;
    y = x^y;

    虽然它并没有性能上的优势,,,,
  • 对于一个位表示为[xn-1,xn-2,…,x0]的操作数x,
    逻辑右移得到的结果是[0,…,0,xn-1,xn-2,…,xk]
    算术右移得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]
    对于Java来说,x>>k进行算术右移,而x>>>k进行逻辑右移

2.整数表示

  • 无符号数的编码(Binary to Unsigned)

    可表示的数范围{0,…,2w-1} 定义UMaxw = 2w-1

  • 补码编码(Binary to Two`s-complement)

    最高有效位 xw-1 也称为符号位,它的”权重“为 -2w-1
    可表示的数范围{-2w-1,…,2w-1-1} 定义TMinw = -2w-1TMaxw = 2w-1-1

  • 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。

  • 由于 B2Uw 和 B2Tw 都是双射,它们就有定义明确的逆映射。将 U2Bw 定义为 B2Uw-1,而将 T2Bw 定义为 B2Tw-1
    将函数 U2Tw 定义为 B2Tw(U2Bw(x)) ,将函数 T2Uw 定义为 B2Uw(T2Bw(x))
    函数U2T描述了从无符号数到补码的转换,而T2U描述了补码到无符号数的转换

    eg. T2U16(-12345) = 53191,U2T16(53191) = -12345 也就是说十六进制数0xCFC7既是-12345的补码表示,又是53191的无符号表示。

    可以推导出 T2Uw(x) = xw-12w + x , 也就是

    U2Tw(u) = -uw-12w + u , 也就是

  • 把short转换成unsigned时,首先改变大小,之后再从有符号到无符号的转换。

  • 无符号数的截断结果 B2Uk([xk-1, xk-2,…, x0]) = B2Uw([xw-1, xw-2,…, x0]) mod 2k
    而补码数字的截断结果 B2Tk([xk-1, xk-2,…, x0]) = U2Tk(B2Uw([xw-1, xw-2,…, x0]) mod 2k)

3.整数运算

  • 无符号加法
    判断无符号 x+y 是否溢出,只需判断x+y是否大于等于x即可。

  • 补码加法
    判断溢出时,当x,y都是负数,但和大于等于0时,负溢出。当x,y都是正数,和小于0时,正溢出。

  • 无符号和补码乘法,乘法运算的位级表示一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值