[英]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.