2015-09-08 64 views
1

我的任務是將此C++代碼移植到Java。我用Java比用C++更好。我在很大程度上理解了位移,但我並不真正瞭解無符號長整型值在這種情況下所做的。從C++到Java的簡單轉換

這在Java中看起來像什麼?

#include <iostream> 
using namespace std; 

int main() { 
    short netSpeed = 3;  
    cout << "netSpeed before: " << netSpeed << endl; 

    netSpeed = 1UL << netSpeed; 
    cout << "netSpeed after: " << netSpeed << endl; 

    return 0; 
} 
+0

你嘗試運行它,並檢查它做什麼...? – Melkon

+0

可能重複的http://stackoverflow.com/questions/9854166/declaring-an-unsigned-int-in-java –

+3

你比Java更好的Java比C++,但你不知道如何打印到控制檯?你看到這個矛盾 –

回答

3

C++開發人員沒有抓住平臺表示有符號整型的機會,可能是1或2的補碼。它們也在防範由於積分值1的溢出而導致的未定義行爲,其可能小至16位int

使用1UL可以讓他們確信轉換的結果是0b1000。 UL正迫使編譯器使用unsigned long類型。

其實它是在這種情況下多餘的,因爲Java的總是使用2的補數爲整型(和他們都簽訂了,除了從char型),這是完全安全的,你在你的Java端口寫1 << netSpeed

+0

我不確定我買了那個。結果值(1 << 3)爲8,這在C++中保證可以用int來表示,所以我不確定開發人員沒有采取什麼樣的機會。 –

+0

我以前看過這種類型的東西的時候不太自信的C++開發人員。我陳述(可能不夠清楚)它是多餘的。 – Bathsheba

-2

這是你的代碼從C++的到Java確切的轉換:

class Speed { 
    public static void main(String args[]) { 
     short netSpeed = 3; 
     System.out.println("netSpeed before: "+netSpeed); 

     netSpeed = (short) (1 << netSpeed); 
     System.out.println("netSpeed after: "+netSpeed); 
    } 
}