随笔-145  评论-173  文章-70  trackbacks-0

符号扩展和截断的几点认识:

1.      符号扩展。。

   short int a = -4;

   short int b = 8;

   print_binary(a);

   print_binary(b);

   unsigned short int c = a; //类型转换

   unsigned int d = a;

   print_binary(c);

   print_binary(d);

   return 0;

结果是:

11111111 11111100

00000000 00001000

11111111 11111100

11111111 11111111 11111111 11111100

请按任意键继续. . .

 

从结果可以看到:

1.类型转换时不改变位的标志的。

2.      符号扩展,将一个有符号的扩展的话是符号扩展。从short扩展到int,由于是负数,所以符号扩展,前面的都是111111……

 

 

2.截断处理:

int a = -4;

   short int b = a;

   int c = 4;

   short int d = c;

   print_binary(a);

   print_binary(b);

   print_binary(c);

   print_binary(d)

结果是:

11111111 11111111 11111111 11111100

11111111 11111100

00000000 00000000 00000000 00000100

00000000 00000100

请按任意键继续. . .

发现了,截断高位,不管符号,都要截断高位的部分。

 

3.乘法和除法:

当存储数据的位数不足以存储乘积的时候,会造成截断误差,通过截断,得到我们的结果不是想要的结果:看下例:

char a = 120;

   print_binary(a);

   char c = 120;

   print_binary(c);

   char d = a * c;

   cout << (short)d << endl;

   print_binary(d);

   int e = a * c;

   cout << e << endl;

   print_binary(e);

   return 0;

 

结果是:

 

01111000

01111000

64

01000000

14400

00000000 00000000 00111000 01000000

请按任意键继续. . .

看到了没有,对于一个char类型的数据,如果将两者的乘积还是保存为char,那么就有可能发生截断,产生误差。此例即为说明,而如果将结果用int来保存,可以看到完整的位表示,然后具体的截断也知道了。此时就可以得到正常的结果,因为有足够的位,没有造成损失。。

 

posted on 2009-10-08 12:38 deercoder 阅读(1627) 评论(0)  编辑 收藏 引用 所属分类: 深入理解计算机系统

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理