符号扩展和截断的几点认识:
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) 编辑 收藏 引用 所属分类:
深入理解计算机系统