最近在學習c++,閒來無事突發奇想隨便寫了幾行**,如上所示。本以為輸出結果會是:# include
using
namespace
std;
int main (void)
而最終結果卻是: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)
q是指向x位址首位元組的指標,只要將其型別char * 強制轉換成int * ,其特點與屬性就與指標p完全相同,也對x有了完全的操作許可權。而ch僅僅是x位址首位元組儲存內容的拷貝,和x沒有任何直接關係 。-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
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...