C語言為什麼要定義short,int,long這麼多整數型別?

時間 2021-05-07 06:36:13

1樓:WangKX

這問題有意思,那為什麼碗盤要分大中小,無非是區別飯菜的份量,你能吃一小碗飯我不會給你盛一大海碗那是浪費糧食。整數型別也一樣,型別不同儲存的資料範圍不同,但占用的記憶體也不同,你儲存幾萬之內的數字用個short就行,用int浪費記憶體

2樓:傳統的幻想書屋

其實就是歷史設計侷限了,當時存在乙個位元組不是8位的計算機,所以也不好規定長度,就乾脆只規定幾個長度有嚴格大小關係的整數型別,具體多長自己去實現了。

按現在這情況來說應該直接型別加位數了,直接i8,i16,i32,f32,f64保證全平台長度一致,畢竟現在乙個位元組不是8位的機器可能見都見不到了,還用什麼int short就是自找麻煩。

3樓:

c語言出現的年代,計算機本身的資源還是非常有限的(記憶體,磁碟都是),出這麼多的型別也是為了這些考慮。

你想你來設計一門語言,需要給變數分配空間,如果沒有啥限制,你當然願意直接拿到現在、未來都不用改的方案,比如128bit甚至更大的,只要是變數都是這種空間形式。但是,對很多應用場合來說,這種方案顯然太浪費儲存空間了。所以,就出一些彈性的方案,給使用者去選擇吧。

4樓:老白Walt

以前人很窮,吃公尺都要用小勺子來量,吃多了可能某天沒得吃就掛了。

後來公尺多了,每次都得來兩勺,太費事,換個大勺吧

天天幹活收公尺,多吃點才幹的快收的多,再換個更大的勺

5樓:霍工

這樣定義,會使得程式相容性和可移植性會變差。低位機型裡除錯好的程式,可以在高位數機型裡執行,而在高位機型裡除錯好的程式,卻不保證能在低位數機型裡執行(多出的位數會擷取忽略)。如果是跨計算機和微控制器的程式,出錯的可能性更大。

比如計算機16位的,微控制器是8位的,定義的int 16型範圍是-65536~65535。但把程式弄到微控制器上範圍會強制變成8位的,多出的位數會擷取,變成-256~255。這樣執行很容易溢位發生錯誤。

6樓:

所以後來有了 stdint 的 int8_t, uint16_t, ssize_t

再後來 golang 直接 int8, uint16, float32

rust 更直接 i8, u16, f32, usize

如果你指的是為什麼不寫 int<16>, int<64>, 嗯, 這個就說來話長了, 我們來採訪一些型別系統比較強大的流行語言:

scala: 那一天人們終於想起了被 Function22 支配的恐怖

typescript: 實現了有什麼用, js 裡用得著嗎

cpp: 雖然我不支援 DT, 但是我對這個情景開洞了哈哈哈哈

rust: 看我幹什麼, 我連 HKT 都沒有, DT 能吃嗎...

haskell: 雖然大家覺得我應該支援, 但是很遺憾我也不支援, 另外, 擴充套件 hs 不是好 hs

7樓:

C語言為了可移植特性,其整型「基礎」字長(也就是原生int長度)是不確定的。如果是16位系統,那麼int就是兩個位元組,如果是32位系統那麼int是4個位元組。short long的定義是依照int來的,short的定義為不大於int,而long的定義為不小於int。

在一些特殊的情況下他們有可能是等於int 型別的字長的。比如,short型別太短需要補位,還不如犧牲一點點儲存空間用處理器的標準字長運算得快。

8樓:Belleve

我來給 @IceBear 舉個更具體的例子好了PDP-10,後期命名為 DECSystem 10,在上世紀 70—80 年代很流行,而它的字長是 36 位,位元組是 9 位,乙個機器字內可以有許多種不同的打包(Packing)方式,這機器的乙個 CHAR_BIT 就是 9。

對於 PDP-10 儲存字元,還有其他的打包方式:

六個 DEC Radix-50 字元打包進 32 位中,剩下 4 位留空

六個 6 位的字元(DEC SixBit,ASCII 0x20——0x5F 這一段)

五個 7 位 ASCII,1 位留空

四個 9 位字元(Multics 約定)

9樓:程式袁

因為C語言是一種強型別的語言,具體為什麼我也聽過就忘了,畢竟會用就行了,如果題主感興趣的話可以去看c語言的發展史。

如果題主覺得C語言定義變數過於繁瑣的話,可以選擇使用python這類的語言。

10樓:日月

這是乙個歷史發展的結果。

C語言之前有一種程式語言是B語言,B語言就沒有資料型別,請原諒人類最開始的原始和簡陋,因為任何技術的發展都是從最簡陋的初始階段開始,然後發現問題,解決問題,繼而產生了新的技術。同事高階程式語言是受到硬體的發展限制的。

當時出現了一種新的計算平台,PDP-11,這種新的處理器可以支援幾種不同長度的資料型別,因為有的計算壓根不需要很長的位數來表達,否則計算效率太低,沒有意義。Thompson在這個平台上用組合語言實現了unix,當然這個過程非常艱辛,編碼的效率和準確率都偏低。這就需要一種全新的程式語言,可以用編譯的方式執行,可以實現型別系統,提高系統的效率。

C語言之父里奇,創立了同時解決資料型別和效率的New B語言,很快就變成了C語言。這也就是型別系統的由來。

後來處理器計算能力提高,人們對計算的需求增大,就開始需要更大位數表示的資料,long long應運而生。之所以c語言標準只給了最低的位數查要求對資料型別,就是照顧不同的計算平台能力考慮的,最早的處理器處理位數非常低的哦。來一張94年出版的書中的圖

現在好一點的嵌入式平台的算力都比原來強太多了!

C專家程式設計

11樓:阿爾薩斯的呼喚

靜態語言嘛,c語言的歷史悠久,早期的運算數字嘛,int就夠了,後面有些運算的數越來越大,需要的空間也越來越大了,所以才有了long. 而至於short,那是覺得有時候參與的運算不需要那麼大儲存空間,所以就用short節省空間哇。

12樓:GarfieldKwong

你看下stdint.h

原因應該是一開始C並沒有標準,每個平台有自己的實現。要先有標準才能統一不同平台編譯器的行為。雖然現在有了標準,但是要修改原有的型別影響太大了。

所以C99就提出了stdint.h。所以你用stdint.

h裡的型別就好了

為什麼要定義C1 C2函式?

格式化 說愁客 這就是對函式光滑性的一種描述,題目裡給出這些條件條件有的時候是為了提示你要使用這個函式的導數來解題,有的時候是告訴你這個題目中不允許使用比他給你的更高階的導數了。 資冶通籤 C1 C2函式有什麼優良的性質,翻一翻數學分析的教材就知道了。函式單調性 凹凸性 極點等等與一階導數 二階導數...

C語言陣列定義時不初始化為什麼會報錯?

陌歸 a i 代表一維陣列中下標為i的元素。假如你定義了乙個a 5 呼叫的時候用的a 5 是越界訪問的下標為5的元素 因為事實上陣列a 5 的下標值只到4 不是整個陣列。只有在定義的時候a代表陣列。 薛非 先定義int ages 5 或int ages 再乙個乙個賦值是可以的,這不可能。請如實描述問...

為什麼有C語言 有C 卻沒有C 語言?

Alds Nick C 這個名字是Rick Mascitti於1983年中所建議的,並於1983年12月首次使用。更早以前,尚在研究階段的發展中語言曾被稱為 new C 之後是 C with Classes 在電腦科學中,C 仍被稱為C語言的上層結構。它最後得名於C語言中的 操作符 其對變數的值進行...