C/C++中char/int/long等基本內置類型為何要編譯器相關而不是固定長度?
這些內置類型一般是和編譯器相關的,而C/C++貌似只是規定了最小長度。
但是程序設計時對變數數值空間的要求一般是按位數來衡量的。邊界問題,溢出問題都是和位數有關係的。貌似這些不定長度的變數很可能會給移植性帶來問題。那麼為什麼語言中不直接原生規定固定長度的內置類型呢?是出於哪方面的考慮?(為了暗示int是當前編譯器針對的體系結構最快的類型?)『主要是這個?』針對這個問題,編程時應注意哪些問題?如何揚長避短?
最早的時候各個CPU的字長不一樣,所以每種CPU用的彙編語言裡邊的字長也不一樣C要直接對應彙編語言C++要兼容C現在的C++/C要向下兼容
可以使用 #include &
我理解標準這麼規定,是為了配合硬體 CPU 的結構。C 語言看似高級語言,實際上就是好看一點的彙編語言,和硬體關係相當大,例如地址匯流排的長度,數據匯流排的長度之類的。
但是標準至少保證1. int 最小是 16 bits2. char 一定是 8 bits 等等。你不用擔心 int 存不下 16 bits 的值。早年計算機的是根據任務精度要求來設計字長的,因此有各種奇葩長度,譬如9位、10位、23位等等,更有堆位片,做出任意字長主機的奇淫巧技。
按2的n次方設計字長,實際是80年代前後,伴隨著個人電腦突飛猛進,8080、6800、Z80等晶元高奏凱歌而逐步固化下來的。
所以,C隨著Unix在校園間流浪的青蔥歲月,不能支持各種字長,那不是自尋短見嗎?
========&> 2015-7-6 &<=&> 應@何輝 要求,解釋下啥叫奇*淫* &<========
在中文語境中,「淫」字的初始含義是太多了、太過了、太濫了(先跑下題哈),所以才會有「淫雨霏霏惹思愁」這樣的句子。
即便到了70年代,在非玩具(PC這個概念在那個時候依然被正統的科學家們視為玩具)領域,要想統一字長依然有那麼一點困難,原因很簡單:計算任務的確定性。那簡直是碼農的黃金時代,因為計算任務的確定也就意味著需求的確定,最難搞的需求都確定了,那還缺啥,不就是缺個碼農了嘛。(好吧,又跑題了)
確定的計算任務,也就必然對應著最佳字長,如何在晶元層來支持有著各種不同最佳字長的體系架構呢?
AMD(嗯,就是那個AMD)提出來位片的概念,偉大的Am2900系列晶元橫空出世了,這是個單晶元4bit的體系,但是可以奇葩的拼接,也就是說基於這個系列的晶元,你可以做出4^n字長的計算機……
這是何等的奇技淫巧啊!
然後,就沒有然後了…………計算機體系架構領域的一次偉大變異,因為各種機緣巧合,就此泯滅在了歷史的長河中!連Old-Computer中都沒有收錄:http://http://www.old-computers.com/在CPU-World中也只留下了隻言片語: AMD 2901 bit-slice processor family幸好還有wiki,感興趣的請移步:AMD Am2900確切的說是ABI規定的
難道不是「剛開始的時候沒管,等到標準化的時候發現不一致只能這麼折中了」么。至於定長。。stdint.h/cstdint不服。
有啊,VC++就提供了signed __int32這樣的類型,可以讓你安心使用。
除了gcc以外,clang,msvc,watcom c,icc都提供了編譯器自帶的定長整數類型
形如__int32,__int8,__int16
可以像使用正常類型那樣使用它們,包括static unsigned __int32這樣不是編譯器相關,是目標架構相關
因為當初設計有點腦抽。為了彌補這個問題,標準庫提供了stdint.h,各個基礎設施庫經常也會提供自己的int頭文件。
因為用int的時候都是絕對不超過上限的,所以上限是多少都無所謂,還便於移植和提高效率,有可能超過上限就不該用int了
推薦閱讀:
※Visual C++.NET的存在意義是什麼?
※如何評價 JetBrains 的新 C/C++ IDE CLion?
※為什麼不能在 std::map 中使用局部類型?
※C++ unordered_map 中 double 作key如何在模板參數中實現?
※C++ std::set 的實現中對於iterator的這個強制轉換是如何進行的?