首先看一道例子:title: 強制型別轉換
date: 2016-06-02 11:03:29
categories: c++
tags:
- c++
- 型別轉換
#include
#include
int main()
輸出結果為:-64。
暫且不分析上邊的題目,從記憶體模型入手分析。
c中,每乙個變數都對應乙個位址。位址空間中的值即0或1的高低電平。
在記憶體中,儲存的值不是0就是1.而變數解析時,是通過起始位址和變數型別來解析的。在計算機記憶體中,是沒有「型別」這個概念的,型別如何定義只是語言層面的事情。
所以資料在記憶體中的儲存是沒有區別的,有區別的僅僅是對資料的處理方式不同。
例如,有如下變數:
int a;
float b;
double c;
假設起始位址是100,那麼機器並不知道100-203是整型或者104-107是float型變數b。當有(float)a時,則是先按照int型別取出該變數在位址中的值,然後再將其按照int to float的規則轉換成float型,編譯器在取出int a對應的值時知道規則是從a的起始位址開始往後取4個位元組的值。
對於指標之間的轉換,指標 to 指標的強制型別轉換是指標所指內容的型別由原來的型別轉換為後面的型別。
int a =1;
int *p=&a;
float *p1=(float *)p;
則p和p1的值都是&a,但是*p
是將&a位址中的值按照int型變數進行解釋,而*p1
則是將&a位址中的值按照float型變數進行解釋。
例:指標型別強制轉換
int m;
int *pm = &m;
char *cp = (char *)&m;
pm指向乙個整型,cp指向整型數的第乙個位元組
題目是將乙個int型別數的位址強制轉換成char型別指標,然後輸出char型別指標指向的值。
從以上的分析可知,轉換後的char型別指標指向int型別的第乙個位元組(實際上是低位址位的乙個位元組)。
那麼char型別的指標指向的是:1100 0000
,
而我們知道,計算機中正數是二進位制的補碼表示,所以將其轉換成補碼(負數的補碼是在原碼的基礎上除符號位不變之外按位取反然後再加1)就是:1100 0000
,即為-64。
c語言指標強制型別轉換,[mhjcumt的專欄].
c語言指標強制型別轉換,[jltxgcy的專欄].
指標型別的強制轉換問題,[知乎].
強制型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...
強制型別轉換
顯式轉換也稱為強制型別轉換 cast 包括以下列名字命名的強制型別轉換操作符 static cast dynamic cast const cast 和 reinterpret cast。命名的強制型別轉換符號的一般形式如下 cast name expression 其中 cast name 為 s...
強制型別轉換
c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dynamic cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。reinterprete...