一、整数
符号 | 类型 | 含义 |
---|---|---|
B 2 T w B2T_w B2Tw | 函数 | 二进制转补码 |
B 2 U w B2U_w B2Uw | 函数 | 二进制转无符号数 |
U 2 B w U2B_w U2Bw | 函数 | 无符号数转二进制 |
U 2 T w U2T_w U2Tw | 函数 | 无符号转补码 |
T 2 B w T2B_w T2Bw | 函数 | 补码转二进制 |
T 2 U w T2U_w T2Uw | 函数 | 补码转无符号数 |
T m i n w Tmin_w Tminw | 常数 | 最小补码值 |
T m a x w Tmax_w Tmaxw | 常数 | 最大补码值 |
U m a x w Umax_w Umaxw | 常数 | 最大无符号数 |
无符号数的编码
对于向量 x → = [ x w − 1 , x w − 2 , ⋯ , x 0 ] \overrightarrow x=[x_{w-1},x_{w-2},\cdots,x_0] x=[xw−1,xw−2,⋯,x0]:
B 2 U w ( x → ) = ∑ i = 0 w − 1 x i 2 i B2U_w(\overrightarrow x)=\sum_{i=0}^{w-1}x_i2^i B2Uw(x)=∑i=0w−1xi2i
U M a x w = 2 w − 1 UMax_w=2^w-1 UMaxw=2w−1
补码编码
最高有效位解释为负权。
对于向量 x → = [ x w − 1 , x w − 2 , ⋯ , x 0 ] \overrightarrow x=[x_{w-1},x_{w-2},\cdots,x_0] x=[xw−1,xw−2,⋯,x0]:
B 2 T w ( x → ) = − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i B2T_w(\overrightarrow x)=-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i B2Tw(x)=−xw−12w−1+∑i=0w−2xi2i
T M i n w = − 2 w − 1 TMin_w=-2^{w-1} TMinw=−2w−1
T M a x = 2 w − 1 − 1 TMax=2^{w-1}-1 TMax=2w−1−1
C语言标准没有要求用补码的形式来表示有符号整数, 但是几乎所有的机器都是这样做的。
无符号和有符号数之间的运算
当执行一个运算时,如果一个运算数是有符号的,而另外一个是无符号的,那么C语言会隐式的将有符号参数强制类型转换为无符号数,并假设两个数都是非负的。
数据扩展
-
无符号数转换成更大的类型数据:在表示的开头添加0。这种扩展称呼为零扩展。
-
补码数转换成更大的数据类型(符号扩展):将补码的最高有效位扩展,这种扩展称之为符号扩展。原理为下述公式,可以简单证明得到。
B 2 T w + 1 ( [ x w − 1 , x w − 1 , x w − 2 , ⋯ , x 0 ] ) = B 2 T = ( [ x w − 1 , x w − 2 , ⋯ , x 0 ] B2T_{w+1}(\textcolor {blue}{[x_{w-1},x_{w-1}},x_{w-2},\cdots,x_0])=B2T_=([\textcolor {blue}{x_{w-1}},x_{w-2},\cdots,x_0] B2Tw+1([xw−1,xw−1,xw−2,⋯,x0])=B2T=([xw−1,xw−2,⋯,x0] -
short sx=-12345; unsigned uy=sx; /*4294954951*/
- unsigned默认为unsigned int。
- 数据扩展和无符号有符号数据转换同时存在时,先进行改变大小,再进行有符号到无符号的转换。