符號擴展和截斷的幾點認識:
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) 結果是:
|
發現了,截斷高位,不管符號,都要截斷高位的部分。
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來保存,可以看到完整的位表示,然后具體的截斷也知道了。此時就可以得到正常的結果,因為有足夠的位,沒有造成損失。。