強制型別轉換中「自以為是」的問題

2021-07-22 03:57:17 字數 1939 閱讀 9935

# 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...