符號擴展和截斷的幾點認識:
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 閱讀(1638)
評論(0) 編輯 收藏 引用 所屬分類:
深入理解計算機系統