スモールエンドモードと強制データ型変換

3544 ワード

スモールエンドモードと強制データ型変換
1.まず一つの問題から切り出す
C++データ型変換の問題
#include 
void main()
{
	int i=0xb62;
	char c;
	c=i;
	cout<

ここではなぜbが出力されているのですか?
2.まず我々が使用しているコンピュータのCPUのバイト順を検出する
バージョン1(問題があり、結果はどうしても34で、34が高アドレスなのか低アドレスなのかは説明できません)
バージョン2(shineyan 1991のメッセージに基づいて修正されたもので、shineyan 1991のアドバイスに感謝します)
上の図から分かるように、CPUのバイト順は、マクロモードである.
インテリジェントポイント
リトルエンドモード
データ型の上位データは高アドレス部、下位データは低アドレス部に格納される.簡単に言えば、高位は後で、低位は前です.大端モード(Big-Endian)データ型の上位データは、下位アドレス部に格納され、下位データは、上位アドレス部に格納される.簡単に言えば、高位は前で、低位は後です.
3.初歩的な分析
0 xb 62は16進数で、charは1バイトなので、私たちは低8ビット(高バイトを捨てて低バイトを残した)しか取りません.これは言語に関係しています.CPUのアーキテクチャに関係なく、1つの16進数ビットは4つのバイナリビットに変換されます.そのため、低8ビットは62に変換され、01100010で、charに渡された後、charの値は98で、ASCIIによってbが出力されます.
4.データ型変換の強制
強制タイプ変換は、タイプ変換演算によって実現されます.一般的な形式は、(タイプ説明子)(式)式の演算結果を強制的にタイプ説明子が表すタイプに変換する機能です.自動変換は、ソースタイプとターゲットタイプが互換性があり、ターゲットタイプがソースタイプより広い場合に別のタイプへの変換が発生します.
オペランドのタイプが異なり、基本データ型に属していない場合、タイプ変換を強制し、オペランドを必要なタイプに変換することがよくあります.強制タイプ変換には、明示的強制変換と暗黙的強制タイプ変換の2つの形式があります.
4.1.明示的強制型変換
明示的な強制タイプ変換には、強制タイプ変換演算子を使用する必要があります.フォーマットは次のとおりです:type()または(type)ここで、typeはint、floatなどのタイプ記述子です.式です.強制タイプ変換演算子によって演算された後、操作数自体は変更されず、演算後の操作数自体は変更されません.たとえば:
int nVar=0xab65;
char cChar=char (nVar);
上記強制型変換の結果、整数値0 xab 65のハイエンド2バイトを削除し、ローエンド2バイトの内容をchar型数値として変数cCharに付与したが、型変換後nVarの値は変化しなかった.
4.2.暗黙的強制型変換
暗黙型変換は、付与式と戻り値のある関数呼び出し式で発生します.賦値式では、賦値子の左右のオペランドタイプが異なる場合、賦値子の右のオペランドを強制的に賦値子の左側のタイプ数値に変換した後、賦値子の左側の変数に賦値します.関数呼び出し時に、return後の式のタイプが関数の戻り値のタイプと異なる場合、戻り値時にreturn後の式の数値を関数の戻り値のタイプに強制的に変換した後、次のように値を返します.
int nVar;
double dVar=3.88;
nVar=dVar;//     ,nVar   3, dVar    3.88 

4.3.強制変換を使用する場合は、次の問題に注意してください.
  1.タイプ説明子も式もカッコ付けしなければなりません(単一変数はカッコ付けなくてもいいです)、(int)(x+y)を(int)x+yと書くとxをint型に変換してyに加算されます.
  2.強制変換でも自動変換でも、データの説明時に定義される変数のタイプを変更することなく、今回の演算の必要性のために変数のデータ長を一時的に変換します.
3.演算子の両方のオペランドのタイプが異なる場合は、まず同じタイプ、すなわち低いタイプを高いタイプに変換してから、演算に参加します.変換ルールは下図のようになります.
double←——float高
  ↑
  long
  ↑
  unsigned
  ↑
int←——char,short低
図中の横矢印は、2つのfloat型数が演算に参加するなど、必要な変換を示し、それらのタイプは同じですが、double型に変換してから演算し、結果もdouble型です.縦矢印は、演算子の両側の演算数が異なるタイプの場合の変換を示し、1つのlong型データが1つのint型データとともに演算される場合、int型データをlong型に変換してから両者を演算し、long型になる.これらの変換はすべてシステムによって自動的に行われ、使用するときは結果のタイプを知るだけでいいです.これらの変換は自動といえるが,C言語は明示的な形式で変換タイプを強制するメカニズムも提供している.
  4.より低いタイプのデータがより高いタイプに変換されると、データの実質的な内容に影響を与えることなく、一般的には形式的に変更されるだけで、より高いタイプのデータがより低いタイプに変換されると、一部のデータが失われる可能性があります.
  5.賦値演算子の両側の演算オブジェクトタイプが異なる場合、タイプ変換が発生します.変換のルールは、賦値演算子の右側の式のタイプを左側の変数のタイプに変換することです.C言語で値を割り当てるときのタイプ変換形式は、式の値にかかわらず、システムが自動的に値演算子の左部変数のタイプに変換するため、精密で厳密ではないと感じさせる可能性があります.変換後のデータは異なる場合があり、注意しないとエラーが発生する可能性があります.これは確かに欠点であり、多くの人々に批判されている.しかし、忘れてはいけないのは、c面言は最初はアセンブリ言語の代わりに設計されたので、タイプ変換が勝手だったことです.もちろん、強制タイプで変換するのは良い習慣で、少なくともプログラムから何をしたいのかがわかります.
5.int------>charタイプ変換時のメモリ操作
1つのint型を強制的にbyteに変換すると、byteは1バイトしかないため、int型は4バイトであるため、intはその最低のメモリ空間の値をbyteに対応するメモリ空間に格納します.図に示すように、char int*******************1 Byte*高位******|
6.最初の問題を深く分析する
メモリアドレスは上から下へ左から右へ順次増加し、小端バイト順は低バイトビットデータがメモリ低アドレスに格納され、高バイトビットデータがメモリ高地アドレスに格納されることを指す.大端バイトシーケンスは、高バイトデータが低アドレスに格納され、低バイトデータが高アドレスに格納される.x 86のCPUアーキテクチャでは,ローエンドバイト順,すなわちローバイトデータをローアドレスに格納し,ハイバイトデータをハイアドレスに格納する.int型のデータをchar型のデータに変換する場合、私たちは8ビット低いだけを取ります.CPUがスモールエンドモードであれば、強制タイプ変換時にバイト内容を調整する必要がなく、非常に便利です.我々のCPUが大端モードであれば,高バイトアドレスのデータを低バイトアドレスに格納する必要があり,すなわちバイト内容を調整する必要がある.
7.まとめ
小端モード:強制変換データはバイト内容を調整する必要はありません.1、2、4バイトの記憶方式のバイトの位置は同じです.