5

float 変数 a を定義し、a を float & および int & に変換します。これはどういう意味ですか? 変換後、 a はそれ自体の参照ですか? また、なぜ 2 つの結果が異なるのでしょうか。

#include <iostream>
using namespace std;
int
main(void)
{
    float a = 1.0;
    cout << (float &)a <<endl;
    cout << (int &)a << endl;

    return 0;
}


thinkpad ~ # ./a.out 
1
1065353216
4

3 に答える 3

14
cout << (float &)a <<endl;
cout << (int &)a << endl;

最初のものは、フロートのようにビットを扱います。2番目のものは、intのようにビットを扱います。float 1.0 のビットはたまたま整数 1065353216 のビットです。

これは基本的に次のものと同等です。

float a = 1.0;
int* b = (int*) &a;
cout << a << endl;
cout << *b << endl;

(int &) aa を整数への参照にキャストします。つまり、a への整数参照です。(先ほど言ったように、 a の内容を整数として扱います。)

編集:これが有効かどうかを確認するために今探しています。そうではないと思います。実際のサイズ以下であるタイプに依存します。

于 2012-05-10T07:47:24.547 に答える
9

これは、未定義の動作を意味します:-)。

真剣に、それは一種のしゃれです。 aですが、floatビットaを含むメモリのブロック (通常は 4 バイト) でもあります。 (float&)aそのメモリのブロックをあたかも であるかのように扱うことを意味しますfloat(つまり、それが実際に何であるか)。(int&)aとして扱うことを意味しintます。a正式には、オブジェクトの実際の型以外の型を持つ左辺値式を介してオブジェクト ( など) にアクセスすることは、型が文字型でない限り、未定義の動作です。実際には、2 つの型が同じサイズである場合、結果はビット パターンの再解釈であると予想されます。

の場合float、ビット パターンには符号、指数、および仮数のビットが含まれます。 通常、指数は超過 n 表記を使用0.0し、指数として 0 のみを持ちます。(PC で使用されるものを含む一部の表現では、基数 2 の正規化された形式では常に 1 でなければならないため、仮数の上位ビットを格納しません。そのような場合、格納された仮数の1.0ビットはすべて 0 になります。 .) また、通常 (ここでの例外については知りません)、指数は上位ビットに格納されます。その結果、浮動小数点値を同じサイズの整数に「しゃれ」と入力すると、浮動小数点値に関係なく、値はかなり大きくなります。

于 2012-05-10T07:55:47.877 に答える
2

a を( への参照)floatとして解釈すると、ドアが大きく開かれるため、値が異なります。ではないので、それを行うと実際にはほとんど何でも起こります。たまたま、それを見ると が得られますが、基盤となるマシンのアーキテクチャによっては、ピンクのチュチュを着た象やクラッシュすることさえあります。int &intaintfloatint106535321642

これは、 から への変換方法を理解する へのキャストとは異なることに注意してintください。へのキャストは、元の意味が何であるかを理解せずに、メモリ内のビットを見るだけです。floatintint &

于 2012-05-10T07:50:49.280 に答える