补码与无符号数
补码转换为无符号数原理:
例如:
T
2
U
w
(
−
12345
)
=
−
123456
+
2
16
=
53191
T2U_{w}(-12345) = -123456+2^{16}=53191
T2Uw(−12345)=−123456+216=53191
无符号数转化为补码原理:
截断数字
无符号数截断
有符号数截断
假如将一个4位数值截断到一个3位数值,表示无符号形式的9和补码形式的-7
无
符
号
形
式
的
9
:
k
=
3
,
2
3
=
8
,
故
9
的
截
断
数
值
为
1
无符号形式的9: k=3,2^{3}=8, 故9的截断数值为1
无符号形式的9:k=3,23=8,故9的截断数值为1
补
码
形
式
的
−
1
:
B
2
U
3
(
−
1
)
=
9
,
B
2
U
3
(
−
1
)
m
o
d
2
3
=
1
,
故
B
2
T
3
(
−
1
)
=
1
,
补码形式的-1:B2U_{3}(-1)=9,B2U_{3}(-1)mod2^{3}=1,故B2T_{3}(-1)=1,
补码形式的−1:B2U3(−1)=9,B2U3(−1)mod23=1,故B2T3(−1)=1,
有符号数隐式强制类型转换到无符号数
试图计算数组a中所有元素的和,代码如下:
#include<stdio.h>
float sum_elements( float a[], unsigned length ){
int i =0;
float result = 0;
for( i = 0; i <= length-1; i ++)
result += a[i];
return result;
}
int main(){
float a[] ={0,1,2,3,4,5,6};
sum_elements(a,0);
return 0;
}
运行结果如下:
预期应该出现0.0,但是出现了内存错误。
因为length是unsigned类型,当 0 - 1 =UMax,而<=同样是unsigned类型比较,任何数只能小于或等于UMax,因此会发生数组越界。
将 unsigned改为int 或者 i < length 将达到预期目标。