Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3012089
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: C/C++

2011-09-26 21:27:01

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类型参数
   




阅读(1993) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~