明明 int / unsigned int 速度比 long / unsigned long 還快,為什麼要還要特別挑 long ?

 

這是近來網友問的,算是半常識。

一些 code 上會挑用 long / unsigned long,我想大多是在 bitwise 操作之類的,因 int / unsigned int 並沒保證它一定要是 32 bits,而 long / unsigned long 在規格書中已被保證,它一定會是大於等於 32 bits (我記得是保證最大值 至少是 2^31 - 1。另注意,我說的是 32 bits,不是 4 bytes,因 compiler 有權自定義 CHAR_BITS 為多少,它便代表了 1 byte = ???? bits )。

所以如果是要存 pointer address,也較建議用 unsigned long,但我印象中 C language 有一種額外的 data type 是給 pointer 用的。

同時建議,必須強烈相依於 int / long 有幾 bits 之資料型態,先行 typedef u32, i32 之類的東西出來,這些行為在單晶片開發時常見,如 C51 之類的,沒記錯的話,確實還有些單晶片之 compiler ,他們定義之 int 是 16 bits。

edisonx 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • novus
  • 1. 真正要保證位元寬度應該引用 stdint.h,有 uint32_t、int32_t、int_least32_t、int_fast32_t 這些type可用,這是標準 C header 但 VC++ 沒有。(因為 VC++ 自認為是 C++ 編譯器,不屑跟隨 C 語言的改進)

    2. C 語言並沒有保證任一種 *原生整數* 必須放得下指標,用 unsigned long 是非常危險的事(這裡給個必死組合:64位元VC。不算冷僻吧?),對於非特定型別指標用 void* 比較保險。如果必要,C 語言有提供 intptr_t(stdint.h) 和 ptrdiff_t(stddef.h),被定義成放得下指標的整數。

    3. 在 sizeof(int) == sizeof(long) 的情況下,int 並不會比 long 快,型別只是編譯器虛擬出來作語意分析用的,硬體根本不會去區別這兩種整數。
  • 這篇文章回頭看確實寫得不好,感謝 novus 之指教。

    查了 stdint.h 部份,VC 在 2008 前確實沒此 header,到 2010 及預定之VS 11 beta,都有 stdint.h 。 ( MSDN 官網 : http://msdn.microsoft.com/en-us/library/hh567368(v=vs.110).aspx , Standard Library features)

    第一次學 C 時,是到 C++ reference 背 C Standard library,較讓人疑惑的是,c++ reference 怎沒收錄到 stdint.h 。

    再次感謝您的補充,句句精華。

    edisonx 於 2012/03/27 19:46 回覆

  • novus
  • cstdint 一直被 C++ 標準遺漏,後來才用 tr1 的方式補進來。現在的 c++11 已經確定有了。

    c 和 c++ 標準並不很一致
  • 原來如此,感謝補充 ^^ 。

    edisonx 於 2012/03/27 21:11 回覆

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼