為什麼c 和c 支援無符號型別,而Java不支援?

時間 2021-05-31 05:21:47

1樓:rundstedt

因為c語言是為了實現unix發明的,而unix最早是在DEC PDP-8上面跑的,這個機器乙個位元組是6位,可以實現0~9、A~Z共36個字元以及可列印不可列印的符號,連實現小寫字母的能力都沒有。當時的儲存器是磁泡,少一位女工就可以少纏無數個線圈。

6位乙個位元組,12位乙個字,有符號數最大可以表達1024,無符號數可以表達2048,這之間的差距也太大了吧!太有意義了。

2樓:Crazyjin

C++是C的直系後代,完全相容C,所以這裡只說C。

首先分析一下無符號型別和有符號型別:有符號型別的資料需要拿乙個bit位來標記是正是負,也就是說無符號型別能表示的正整數範圍是有符號型別的2倍。

C語言的設計初衷就是重寫UNIX。能用乙個unsigned int存放的正整數要用long來存放的話,意味著操作這個資料的時候要從記憶體讀取兩次、存也要存兩次。考慮到暫存器、快取和記憶體三者之間的訪問資料速度上的差異,系統級別的程式很難接受一次訪問變成兩次訪問。

樓上也說了,C語言沒有過度地對硬體進行抽象:記憶體才不管存的是有符號還是無符號資料呢,都是二進位制資料。這也是乙個原因。

有的程式語言沒有無符號資料是因為這些語言需要更多的抽象從而提高程式設計的速度。這也意味著這些程式語言不適合高效能的軟體開發,更難以直接操作硬體。

從節省記憶體的角度來看,雖然用unsigned節省不了多少記憶體。但是在C語言誕生的那個年代,記憶體還是很稀缺的資源,能省一點是一點。現在嘛,很多程式語言和程式設計師已經沒有省記憶體這條準則了。

相反,能搶到多少記憶體算多少。很直觀的一點就是:Android手機卡得一逼!

Android手機卡得一逼!Android手機卡得一逼!Anroid手機執行記憶體再大都不夠用!

Anroid手機執行記憶體再大都不夠用!Anroid手機執行記憶體再大都不夠用!

為什麼C語言沒有String型別?

封禁讓我戒乎 語言實現了String,開發者可以省心很多。比C早的Pascal就實現了String,C沒實現,應該是語言的設計者沒有預見到字串操作的頻密。我喜歡Delphi,字串操作方便也是原因之一。 王璐銘 從語言的抽象度角度來說,C是底層語言,他解決的問題一般位於機器模型空間。但是,String...

C 中超出精度double型別的值為什麼會出現這種現象?

邱昊宇 真心沒那麼複雜。問 比 3 小的最大 double 究竟是多少?答 是 std nextafter 3.0,2.0 比如 double maxBelowThree std nextafter 3.0 2.0 auto uniqueDigits std numeric limits max d...

為什麼在C 中泛型型別不能是Explicit Layout的?

這個LayoutKind列舉的 Explicit 的值,文件是這樣定義的 在未管理記憶體中的每乙個物件成員的精確位置是被顯式控制的,服從於Pack欄位的設定。每個成員必須使用FieldOffsetAttribute指示該字段在型別中的位置。就是,成員必須有FieldOffsetAttribute去顯...