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
/* 如果你实在想这样的话.... */