# include
using
namespace
std;
int main (void)
最近在學習c++,閒來無事突發奇想隨便寫了幾行**,如上所示。本以為輸出結果會是:
g -185 -185
g -185 -185
press any key
tocontinue
而最終結果卻是:
g 71
71g -185 -185
press any key
tocontinue
如下圖:
int x = -185在記憶體中的二進位制儲存:
ch 是0100
0111十進位制為71即71的ascii對應字元g;
那麼(short)ch當然是占用了0x18ff3c和0x18ff3d兩個位元組,其二進位制為1111
1111
0100
0111,所以結果為-185;
(int)ch則占用了x的所有四個位元組記憶體,結果依然為-185;
自以為是這樣,而實際並非如此,即「自以為是而以人為非也」。那麼真正的儲存形式是怎樣的呢?
首先我們來看變數ch的位址測試結果:
注意測試時,由於cout的特性需要在&ch和q前加上(int *),否則輸出的就是字元形式的類似於亂碼的位址了。由測試結果可以看出,指標q的指向和指標p的指向相同,但是ch的位址並非「自以為是」的q指向的位址。而是下圖所示的儲存形式:
測試結果:
儲存形式:
這樣就可以解釋為什麼,強制轉換x和強制轉換ch的輸出結果有差異的問題了:
(1)、ch的位址並非q指向的位址,q指向的位址也並非為ch所占有,只是ch通過*q讀取了q指向位址的儲存值0100 0111,並複製了該二進位製到自己所占有的記憶體之中即0x18ff30。而強制型別轉換(short)ch,(int)ch都只讀取了ch僅有的0100 0111,所以其值也為71(或者g)。
(2)、對於如何通過ch和*q的區別,我們可以用以下**具體地完全地區分開(對於c++的cout使用時的細節還不是特別熟悉。所以用c**測試):
# include
int main (void)
**執行結果為:
-185 -185
g-185 -185
g-185 -185
g71 71 g
0xffffff47 0xffffff47 0x47
0xffffff47 0xffffff47 0x47
0xffffff47 0xffffff47 0x47
0x47 0x47 0x47
press any key to continue
q是指向x位址首位元組的指標,只要將其型別char * 強制轉換成int * ,其特點與屬性就與指標p完全相同,也對x有了完全的操作許可權。而ch僅僅是x位址首位元組儲存內容的拷貝,和x沒有任何直接關係 。 matlab中強制型別轉換 型別轉換
上一期提到 隱式型別強制轉換 implicit type coercion 隱式型別強制轉換會造成意外。為了避免出現意外,c 提供了明式型別轉換,允許程式設計師通過使用型別轉換操作 cast operator 主動轉換資料的型別。型別轉換操作也可直接稱為型別轉換 type conversion ty...
C 中型別強制轉換
c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...
《C primer》 中 強制型別轉換
命名的強制型別轉換符號一般形式如下 cast name expression 其中cast name為static cast,dynamic cast,const cast,reinterpret cast之一,type為轉換目標,而expression為被強制型別轉換的值。強制轉換的型別指定了在e...