簡體   English   中英

這是什么意思? (int&)a

[英]What does this mean? (int &)a

定義一個浮點變量a,將a轉換為float&和int&,這是什么意思? 轉換后,a是自己的參考? 為什么這兩個結果不同?

#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
cout << (float &)a <<endl;
cout << (int &)a << endl;

第一個處理像是浮點數的位。 第二個處理比特,就像它是一個int。 float 1.0的位恰好是整數1065353216的位。

它基本上相當於:

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

(int &) a(int &) a轉換為對整數的引用。 換句話說,對a的整數引用。 (正如我所說的那樣,將a的內容視為整數。)

編輯:我現在環顧四周,看看這是否有效。 我懷疑它不是。 這取決於類型是否小於或等於實際大小。

這意味着未定義的行為:-)。

說真的,這是一種形式的雙關語。 a是一個float ,但a也是一個內存塊(通常為4個字節),其中包含位。 (float&)a處理該內存塊的方法,就好像它是一個float (換句話說,它實際上是什么); (int&)a將其視為int 正式地,通過具有除對象的實際類型之外的類型的左值表達式來訪問對象(例如a )是未定義的行為,除非該類型是字符類型。 實際上,如果兩種類型具有相同的大小,我希望結果是對位模式的重新解釋。

float的情況下,位模式包含符號,指數和尾數的位。 通常 ,指數將使用一些多余的n表示法,而只有0.0將表示0作為指數。 (某些表示,包括在PC上使用的表示,不會存儲尾數的高位,因為在基數2中的標准化形式中,它必須始終為1.在這種情況下, 1.0的存儲尾數將具有所有位0.)通常(我不知道這里有任何例外),指數將存儲在高位中。 結果是當您將浮點值“打字”為相同大小的整數時,無論浮點值如何,該值都會相當大。

這些值是不同的,因為將float解釋為int & (引用int )會使門敞開。 a不是int ,所以當你這樣做時,幾乎任何事情都可能發生。 實際上,看着那個float就像它是一個int給你1065353216 ,但根據底層的機器結構,它可能是42或粉紅色的芭蕾舞短裙或甚至崩潰的大象。

請注意,這與轉換為int ,后者了解如何將float轉換為int 轉換為int &只查看內存中的位而不了解原始含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM