同じバイトサイズを持つ2つの変数型がどのようになっているのかを理解しようとしていますか?
変数がある場合、それはサイズが 1 バイトです..コンピューターは、それがブール型変数ではなく文字であることをどのように判断できますか? それとも、短い整数の文字または半分ですか?
プロセッサは知りません。コンパイラは、適切な方法でメモリ内のバイトを操作するためにプロセッサが実行する適切な命令を生成し、生成しますが、プロセッサ自体にとっては、データのバイトはデータのバイトであり、何でもかまいません。
言語はこれらに意味を与えますが、それはプロセッサが実際には認識していない抽象化です。
コンピューターはそれを行うことができません。コンパイラは. char または bool キーワードを使用して変数を宣言すると、コンパイラは、その変数が占有するメモリを、その特定の型に適した方法でコンピューターに処理させるコードを生成します。
たとえば、32 ビットの整数は、メモリ内で 4 バイトを占有します。それをインクリメントするために、CPUには「このアドレスで32ビット整数をインクリメントする」という命令があります。それがコンパイラが生成するものであり、CPU は盲目的にそれを実行します。アドレスが正しいかどうか、そこにどんなバイナリ データがあるかは気にしません。
変数をインクリメントするための命令のサイズは別の問題です。さらに 4 バイトほどかかる可能性がありますが、命令 (コード) はデータとは別に格納されます。メモリ内の同じ場所を処理するプログラム用に生成された多くの命令が存在する場合があります。命令のサイズを事前に正式に指定することはできません。これは、特定の操作に使用される命令の数が最適化によって変更される可能性があるためです。これを確認する唯一の方法は、プログラムをコンパイルし、生成されたアセンブリ コード (命令) を確認することです。
また、C の共用体も見てください。共用体を使用すると、異なるデータ型に対して同じメモリ位置を使用できます。コンパイラはそれを可能にし、コードを生成しますが、何をしているのかを知る必要があります。
タイプを指定するからです。C++ は厳密に型指定された言語です。あなたは書くことができません$x = 10
。:)
それは知っている
char c = 0;
のchar
理由は...まあ、char
キーワードです。
一般的に、それはできません。の制限を見てくださいdynamic_cast<>
。これはまさにそれを行おうとしています。dynamic_cast
ポリモーフィックな基本クラスから派生したオブジェクトの特殊なケースでのみ機能します。これは、そのようなオブジェクト (およびそれらのみ) に余分なデータが含まれているためです。char と int にはこの情報がないため、使用できませんdynamic_cast
。
コンピューターは 1 と 0 しか認識しません。変数の内容を把握できます。
そのデータを必要なものにキャストすることもできます。
char foo = 'a';
if ( (bool)(foo) ) // true
{
int sumA = (byte)(foo) + (byte)(foo);
// sumA == (97 + 97)
}
また、データ キャスティングを調べて、メモリの場所をさまざまなデータ型として調べます。これは、char または構造体全体と同じくらい小さくすることができます。