深入理解计算机系统——第二章小结(2)

1. 二进制补码

  B2U(X) =                 x[i]*2^i     (i=0;i<=w-1)
  B2T(X) = (-1) * x[w-1] + x[i]*2^i     (i=0;i<=w-2)

U表示无符号数,T表示又符号数,而大部分计算机都采用二进制补码( Two's - complement )来表示符号整数。

简单的说,二进制补码相比无符号二进制根本的区别在于,最高位作为负权( negative weight )使用。

由上引出很多细节,其中最值得了解的就是,如果强制类型将他们互相转换呢

2. 映射转换 (P: unsigned i = (unsigned) int k )
我们得到两种表达方式在 0~2^(w-1)-1 内是相同的。
而其他时候,将会造成数值的突变。

 T2U()
{
 if (T>=0) U = T;
 else 
 U = T + 2^w
}
 U2T()
{
 if (U<2^(w-1)) T = U;
 else 
 T = U - 2^w
}

3. GCC编译器在处理一个运算时,如果出现了一个符号而另一个无符号,将会默认隐式转换为无符号处理

4. 关于一个变量 i 的常量定义

int32 i;
i = -2147483648  // 2147483648 == 2 to the 31st
/*这样是错误的,因为编译器处理-X时是首先读取X,再对其取反,
   但是2147483648太大了,不能表示为32位符号数的补码*/

i= -2147483647-1
/* 如果你实在想这样的话.... */

此条目发表在C, 系统分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注