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-1,TMaxw = 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时,正溢出。无符号和补码乘法,乘法运算的位级表示一样。