3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
C 中數(shù)據(jù)類型的大小是特定于實(shí)現(xiàn)的。對(duì)于16位機(jī)器,int是2字節(jié),對(duì)于32位機(jī)器,它是4字節(jié),對(duì)于64位機(jī)器,它是4或8字節(jié)。(Windows 10 上的 Visual Studios 2019 產(chǎn)生 4 個(gè)字節(jié),而 Linux 計(jì)算機(jī)上的 FCC 產(chǎn)生 8 個(gè)字節(jié)。)
要檢查 int 大小,請(qǐng)使用“sizeof(int)”。
C 編譯器還可以定義 int16_t、int32_t、int64_t,以及 int16、int32 和 int64,只是為了讓事情變得有趣。當(dāng)你將近半個(gè)世紀(jì)的歷史強(qiáng)加到一種語(yǔ)言上時(shí),就會(huì)發(fā)生這種情況。這就是為什么 sizeof 如此重要,因?yàn)閷?duì)大小進(jìn)行硬編碼可能適用于一種編譯器,但可能不適用于另一種編譯器。

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
C 指定最小類型大小,并且不同實(shí)現(xiàn)之間使用的實(shí)際大小存在差異。另一方面,Java 指定了精確的類型大小,因此實(shí)現(xiàn)之間沒(méi)有差異。
有些程序員總是喜歡指定每種類型的確切大小。如果您這樣做,您可能會(huì)更喜歡 Java?;蛘撸?C 中,您可以包含標(biāo)頭<inttypes.h>
并使用 C 的精確大小類型,例如int16_t
和int32_t
。
但在回答你的問(wèn)題“為什么 Java 中的類型是兩倍大?”時(shí),這是無(wú)法回答的,因?yàn)閱?wèn)題的前提是有缺陷的。你說(shuō),“例如,在 C 中,int 是 2 個(gè)字節(jié)”,但事實(shí)并非如此。最小保證大小為 2 個(gè)字節(jié),但在當(dāng)今最流行的機(jī)器上為 4 個(gè)字節(jié)。

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
C 和 Java 對(duì)于可移植性有不同的方法。
由于編譯后的 C 代碼(通常)在本機(jī)運(yùn)行,因此 C 規(guī)范避免強(qiáng)制指定特定大小,因?yàn)檫@會(huì)因不同機(jī)器而異。相反,它指定每種類型必須能夠表示的最小值范圍。An必須至少int
能夠表示range ,這意味著它必須至少有16 位寬,但也可以更寬。在現(xiàn)代桌面平臺(tái)上,它通常是 32 位寬。[-32767..32767]
編譯后的 Java 代碼 OTOH(通常)在虛擬機(jī)(基本上是機(jī)器級(jí)解釋器)中運(yùn)行,并且指定 VM,以便類型始終具有固定大小。VM 負(fù)責(zé)將 Java 類型映射到本機(jī)計(jì)算機(jī),因此在 16 位平臺(tái)上運(yùn)行的 VM 可能需要做一些有趣的操作來(lái)表示 32 位int
.