float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl; //(int&)a , 是什麼意思?
cout << boolalpha << ( (int)a == (int&)a ) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl;
輸出結果是:
11065353216
false00
true
為什麼是這種結果啊?
(int)a實際上是以浮點數a為引數構造了乙個整型數,該整數的值是1,(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)。因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。對b的兩種轉換意義同上,但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。
注意,程式的輸出會顯示 (int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在記憶體中,按ieee754規定,其內容為 0x0000803f(已考慮位元組反序)。這也就是a這個變數所佔據的記憶體單元的值。當(int&)a出現時,它相當於告訴它的上下文:「把這塊位址當做整數看待!不要管它原來是什麼。」這樣,內容0x0000803f按整數解釋,其值正好就是1065353216(十進位制數)。
通過檢視彙編**可以證實「(int)a相當於重新構造了乙個值等於a的整型數」之說,而(int&)的作用則僅僅是表達了乙個型別資訊,意義在於為cout《及==選擇正確的過載版本。
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...
一道面試題
如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...