博主水平有限,全文仅为摘录,如有错误,请不吝指出
整型数据类型
字节(byte)是计算机文件大小的基础单位,
位(bit)是计算计算机运算的基础.
1个字节由八个二进制组成,能表示0~255值的范围
整型数据类型在32/64位程序取值范围不同,具体如图所示:


无符号数的编码
定义:假设对于一个w位的无符号整数,用二进制比特位可以表示为[xw−1 , xw−2 , … ,x2 , x1 , x0]。那么我们可以用一个函数表示如下:

使用示例如下:

我们也就可以得知能表示的最大值为:
UMaxw≐i=0∑w−12i=2w−1
补码编码
同样的,补码编码定义有:
对向量x=[xw−1,xw−2,…,x2,x1,x0]:
B2Tw(x)≐−xw−12w−1+i=0∑w−22i
使用示例如下:

我们就可以得知能表示的最大值为:
TMaxw≐i=0∑w−22i=2w−1−1
最小值有:
TMinw≐−2w−1.
值得说明的是无论是无符号编码还是有符号编码全部都具有唯一性.
反码
除最高有效位为的权是−(2w−1−1)而不是−2w−1,其余和补码是一样的:
B2Ow(x)≐−xw−1(2w−1−1)+i=0∑w−2xi2i
(过去机器基于反码表示,但几乎所有的现代机器都使用补码了)
原码
最高有效位是符号位:
B2Sw(x)≐(−1)xw−1∗(i=0∑w−2xi2i)
(浮点数中使用原码编码)
有符号数和无符号数之间的转换
补码转换为无符号数
我们推导一下补码到无符号的转化,我们先将无符号编码和补码编码的公式相减,
有
B2Uw(x)−B2Tw(x)=xw−12w−1−(−xw−12w−1)=xw−12w
即
B2Uw(x)=xw−12w+B2Tw(x)
令x为T2Bw(x),有:
B2Uw(T2Bw(x)=xw−12w+B2Tw(T2Bw(x))=x+xw−12w+
即有:
T2Uw(x)=xw−12w+x
又xw−1大于等于0时,则补码编码为正数,此时T2Uw(x)=x 。
综上有

无符号数转换为补码
同样的,我们先将无符号编码和补码编码的公式相减,
有
B2Uw(x)−B2Tw(x)=xw−12w−1−(−xw−12w−1)=xw−12w
即
B2Tw(x)=B2Uw(x)−xw−12w
令u为U2Bw(u),则 B2Tw(U2Bw(u))=B2Uw(U2Bw(u))−uw−12w=u−uw−12w
即
U2Tw(u)=u−uw−12w
而位uw−1决定是否大于TMaxw=2w−1−1,
即可得:


扩展一个数字的位表示
零扩展
将一个无符号数转换为一个更大的数据类型,我们只需简单的在开头加0即可.
符号扩展
将补码数字转换为一个更大的数据类型
在开头加上符号位即可.
截断数字
截断无符号数
截断为k位有B2Uk([xk−1,xk−2,...,x0])=B2Uw([xw−1,xw−2,...,x0]) mod 2k
截断补码
与截断无符号数相同只不过要将最高位转换为符号位.
截断为k位有
B2Tk([xk−1,xk−2,...,x0])=U2Tk(B2Uw([xw−1,xw−2,...,x0]) mod 2k)