2016-09-09 5 views
3

これはかなり興味がありましたが、100%間違っているかもしれませんが、あるタイプを別のタイプにキャストすると、メモリ/値を見て、新しいタイプとしてそのメモリ/値を扱いますか?例えばC++ - キャスト変数とそれをどのように扱うのですか?

:これが正しい場合

char Letter = 'A'; 
int iLetter = static_cast<int>(Letter); 
//iLetter is 65 

は、それが「手紙」のメモリ位置/値を見て、その後、あなたはそれをキャストしている今まで何を表現するための値を変更しますか?私はこの理論にすべての値を整数として描き、char/struct/classなどにキャストしていました。

これは完全な質問です。私は鋳造がどのように実際に

+0

文字を見ることなく何かに変換するのはやや難しいので、ここではLetterの価値はここで「見える」ようになります。 「Letter」の値が何らかの形で変更されているかどうかを確認する場合は、ここでは「no」と答えます。 –

+0

"Letter"の値が変更されているのではなく、 "Cast"が "Letter"からint値を受け取る方法が不思議でした。それが意味をなさないならば、私が正しく言わなかったら、すみません。 –

+0

* cast *は結果を格納する方法を*コンパイラに指示します。 '= '演算子は実行時にルック・アヘッドを行います。 – EJP

答えて

3

(ポインタまたは参照とは対照的に)値をキャストする状況では、コンパイラはキャストされている値から新しい値を作成します。新しいタイプとして既存の場所。

具体的には、コードがcharあるLetterの値を見て、integer conversion rules of C++を用いintcharを延長し、それからiLetterを構築します。これには符号付きタイプの符号拡張が含まれている可能性があります。したがって、負の値signed charは負の値intになります。

一方、ポインタをキャストすると、同じ場所が新しいタイプとして解釈されます。

+0

注:ポインタのキャスト状況は、その要約よりもやや複雑です(例:複数の継承キャスト、アライメントされていないキャスト –

+0

上記に同意します。一番上の簡単な説明は実際にキャストの再解釈にのみ適用されます。言い換えればいいかもしれない。 –

0

何あなたのキャストがやっていることはimplicit conversionあり、そしてそれはキャストが冗長であり、必要に応じていないこと、ちょうどこの操作を行います。

int iLetter = Letter; //This is a safe conversion as well 

これは、それがメモリ位置/値を見ない正しい場合「手紙」の

はい。明らかに、Letterの値は、見た変数の値のように調べられます。そうでなければ、コンパイラはあなたが何を話しているか分かりません。

- 値を変更して、キャストする値を変更しますか?

元の値は変更されず、コピーされ、その値はintにキャストされ、文字コードが返されます。

+0

文字の価値はどのように見えますか?これは、コードが何らかの形で特別な検査を実行しているかのように見せかけますが、コンパイラが変換が安全であることを認識し、値が "特別な配慮を受けているという意味で、「見た」と述べました。 – kfsone

+0

キャストが**明示的**変換を行っています。キャストのないコードは**暗黙の**変換を行っています。 –

1

あなたのケースでは、static_castは新しいタイプの一時変数を作成し、それをiLetterに設定します。

編集: これは、static_castはメインのvarタイプを変更せず、単に読み込むことを意味します。最後に、変換された値を直接iLetterに入れません。新しいタイプの一時変数を作成し、それはiLetter内で設定されます。

+0

この回答は何を意味していますか? –

+0

変数には常に「一時的な値」または単に「値」という名前があります。 –

関連する問題