0

以下の比較ステートメントで何が起こるかを理解しようとしています。

int n = 1;

std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" );

上記のステートメントの出力は次のとおりです-Y-

私の最初の質問は、なぜポインターをchar*ではなく にキャストするのint*かということです。

また、char と int を比較する場合、答えは のように思われます-N-

と比較すると、char は自動的に int に変換され1ますか?

4

3 に答える 3

3

これは恐ろしいコード -Y-ですが、intの内容をnバイト配列として効果的に処理しているため、マシンのバイト順序は(don'int = 1と同じ方法での値を格納するようになっているためです。char[] = { 1 , 0 , 0, 0};これに頼る!)

したがって、これはあなたがやっていたようなものです

int someInt = 1;
char someChar = 1;
if (someInt == someChar)
{
  puts("-Y"-):
}
else
{
  puts("-N"-):
}

2番目の質問(およびタイトルの質問)に答えるために、はいC ++(およびC)は暗黙的に型の昇格を行います。C++演算子の暗黙的な型変換ルールを参照してください。

于 2012-08-28T04:02:05.810 に答える
1

答えはエンディアンに依存します:

>>> struct.pack('<i', 1)
'\x01\x00\x00\x00'
>>> struct.pack('>i', 1)
'\x00\x00\x00\x01'

-Y-リトルエンディアンのバイトオーダーに対応。

于 2012-08-28T04:06:45.857 に答える
1

char と int を比較しているかもしれませんが、ここでの char の値は何ですか? 投稿したコードだけではわかりません。環境によって異なる場合があります。

char を int に変換して比較するのではなく、int の一部を切り取って char として扱い、昇格させて比較します。リトル エンディアン マシンではおそらく 1 になり、ビッグ エンディアン マシンでは 0 になります。

于 2012-08-28T04:08:11.523 に答える