2.2整数表示
a.整数的表示主要通过两种,以w位模式为例:
无符号数的编码——所有的位均用来表示数值,转换规则同二进制—>十进制
补码编码——最高位(x[w-1])作为负权位,其权值为2^(w-1),其余部分遵循二进制->十进制规则
通过学习这部分,注意到了两点:
对于有符号整数,最大值+1=最小值的绝对值;
无符号整数的最大值=有符号整数的最大值*2+1;
有符号整数与无符号整数转换时遵循规则:位值不变,只是解释方式不同
且有公式关系:B2U(x)=B2T(x)+2^w, w位数字二进制位数
b.数字的扩展与截断
将一个短字节数字扩展为一个长字节数字时,要保证其值不变。有规则如下:
unsigned——左端直接加0,零扩展
signed——左端拷贝原有最高有效位之值(此时可以保证值不变)
c.编程漏洞
在signed向unsigned转换时常常出现问题。因为unsigned没有权值位,所以进行【减】运算时不会出现负值。比如程序:
#include
int main()
{
int length=0;
printf("length-1u=%u\n",length-1u);
printf("length-1u=%d\n",length-1u);
system("pause");
return 0;
}
结果:
length-1u=4294967295
length-1u=-1
这里面主要有两点问题:
1)unsigned与signed数字一起运算,自动转换成unsigned型,系统默认数字均为signed
2)(unsigned) 0-1时,结果变为0xFFFFFFFF,结果成了UMax
3)同样的位模式可以通过pirntf的参数%d,%u进行设定解释的方式
解决这类问题的方法是尽量避免使用unsigned类型,使用signed类型参数
阅读(2037) | 评论(0) | 转发(0) |