符號擴充套件和截斷的幾點認識:
1. 符號擴充套件。。
short
inta
= -4;
short
intb
= 8;
print_binary(a
);
print_binary(b
);
unsigned
short
intc= a
; //
型別轉換
unsigned
intd= 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
intb= a
;
intc
= 4;
short
intd= 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
);
chard=
a* c;
cout
<< (
short)d
<<
endl
;
print_binary(d
);
inte= a
* c;
cout
<<
e<<
endl
;
print_binary(e
);
return
0;
結果是:
01111000
01111000
64
01000000
14400
00000000 00000000 00111000 01000000
請按任意鍵繼續
. . .
看到了沒有,對於乙個char型別的資料,如果將兩者的乘積還是儲存為char,那麼就有可能發生截斷,產生誤差。此例即為說明,而如果將結果用int來儲存,可以看到完整的位表示,然後具體的截斷也知道了。此時就可以得到正常的結果,因為有足夠的位,沒有造成損失。。
資料的擴充套件與截斷
最近時間比較閒,無事拿著深入理解計算機原理讀了起來 突然發現,平時只知道寫 很多細節方面的知識都被我們忽略了,而這些東西隨時都可能給我們的程式造成乙個災難性但卻又難以發現的漏洞,比如在我們平時用c或c 程式設計的時候,我們經常會用到類似資料型別強制轉換等操作,而我們卻沒有用心去考慮,這樣的轉換是否存...
零位擴充套件和符號位擴充套件
1 符號擴充套件 當用更多的記憶體儲存某乙個有符號數時,由於符號位位於該數的第一位,擴充套件之後,符號位仍然需要位於第一位,所以,當擴充套件乙個負數的時候需要將擴充套件的高位全賦為1 對於正數而言,符號擴充套件和零擴充套件是一樣的,因為符號位就是0 比如乙個用乙個8 位二進位制表示 1,則是 100...
單行截斷和多行截斷問題
span 多行截斷有好幾種方法,1 最簡單,使用 webkit line clamp 當然了,只能用在webkit核心瀏覽器,並且不支援自定義點選展開的樣式。p 2 也是面試中回答的方式,使用偽類。這個由於要使用js判斷是否超出,因此適用於,你已經知道是大段文字的情景。但是面試官不是很滿意這個方式,...