java unsigned int




為什麼Java不支持unsigned int? (10)

為什麼Java不包含對無符號整數的支持?

在我看來,這是一個奇怪的遺漏,因為它們允許編寫不太可能在意外大的輸入上產生溢出的代碼。

此外,使用無符號整數可以是一種自我記錄的形式,因為它們表明無符號整數打算保存的值從不應該是負數。

最後,在某些情況下,無符號整數可以更有效地執行某些操作,例如除法。

包括這些的缺點是什麼?


Java確實有無符號類型,或者至少有一個:char是一個無符號短整型。 因此無論Gosling拋出什麼藉口,實際上只是他的無知為什麼沒有其他無符號類型。

另外短型:多媒體短時間用於所有的時間。 原因是你可以在一個32位無符號長整型中插入2個採樣並向量化許多操作。 與8位數據和無符號字節一樣的東西。 您可以將4個或8個樣本放入寄存器中進行矢量化。



只要簽名和未簽名的整數在表達式中混雜在一起,就會變得雜亂無章,您可能丟失信息。 將Java限制為已簽名的ints只能真正解決問題。 我很高興我不必擔心整個簽名/未簽名的業務,儘管我有時會錯過一個字節的第8位。


因為unsigned類型是純粹的邪惡。

在C unsigned - int生成unsigned的事實更加邪惡。

以下是不止一次燒毀我的問題的快照:

// We have odd positive number of rays, 
// consecutive ones at angle delta from each other.
assert( rays.size() > 0 && rays.size() % 2 == 1 );

// Get a set of ray at delta angle between them.
for( size_t n = 0; n < rays.size(); ++n )
{
    // Compute the angle between nth ray and the middle one.
    // The index of the middle one is (rays.size() - 1) / 2,
    // the rays are evenly spaced at angle delta, therefore
    // the magnitude of the angle between nth ray and the 
    // middle one is: 
    double angle = delta * fabs( n - (rays.size() - 1) / 2 ); 

    // Do something else ...
}

你有沒有註意到這個錯誤? 我承認在加入調試器後我只看到它。

由於n是無符號類型size_t因此整個表達式n - (rays.size() - 1) / 2評估為unsigned 。 該表達式旨在作為第n射線與中間射線的有符號位置:左側中間射線的第1條射線位置為-1,右側第1條射線位置為+1,等等在獲取絕對值並乘以delta角度後,我會得到第n射線和中間角度之間的角度。

不幸的是,對於我來說,上面的表達式包含了無符號的邪惡值,而不是對-1進行求值,而是將其計算為2 ^ 32-1。 後續轉換為double密封該錯誤。

在錯誤使用unsigned算術引起的一個或兩個錯誤後,人們開始想知道額外的位是否值得額外的麻煩。 我盡可能地盡量避免在算術中使用unsigned類型,但仍將其用於非算術運算,如二進制掩碼。


恕我直言,原因是因為他們太懶惰,無法實施/糾正那個錯誤。 建議C / C ++程序員不理解無符號,結構,聯合,位標誌......只是荒謬的。

以前你正在和一個基本/ bash / java程序員談論開始編程一個la C的邊緣,而沒有任何真正的這門語言的知識,或者你只是在自己的腦海裡說話。 ;)

當你每天從文件或硬件處理格式時,你開始質疑,他們在想什麼。

這裡的一個很好的例子就是嘗試使用無符號字節作為自旋循環。 對於那些不了解最後一句話的人,你怎麼稱呼自己是一名程序員。

DC


我可以想到一個不幸的副作用。 在java嵌入式數據庫中,您可以使用32位id字段的id數為2 ^ 31,而不是2 ^ 32(〜20億,不是〜40億)。


我知道這篇文章太舊了, 但是為了您的興趣,在Java 8及更高版本中,可以使用int數據類型來表示無符號的32位整數,其最小值為0,最大值為2 32 -1。 使用Integer類可將int數據類型用作無符號整數,並且可以在Integer類中添加像compareUnsigned()divideUnsigned()等靜態方法,以支持無符號整數的算術運算。


我聽說過他們將被包括在接近Java版本的故事中。 Oak是Java的先驅,並且在某些規範文檔中提到了被使用的值。 不幸的是,這些從來沒有成為Java語言。 就任何人都能弄清楚,他們只是沒有得到落實,可能是由於時間的限制。


有了JDK8它對它們有一定的支持。

儘管Gosling擔心,我們仍可能會看到Java中無符號類型的全面支持。


這來自對高斯林和其他人採訪 ,關於簡單性:

Gosling:對於我來說,作為一名語言設計師,我現在並不認為自己真的是那麼簡單,但真正意義上的“簡單”意味著什麼,我可以期待J.Random Developer能夠在他的腦海中保持這個規範。 這個定義說,例如,Java不是 - 事實上,很多這些語言最終都會遇到很多角落案例,這些都是沒有人真正理解的。 測驗任何C開發者關於未簽名的,很快你會發現幾乎沒有C開發人員真正理解什麼是無符號的,什麼是無符號算術。 像這樣的事情使C複雜。 我認為Java的語言部分非常簡單。 你必須查找庫。





integer