看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《littleshan (我要加入劍道社!)》之銘言: : 注意 a/24 > b 不可以改成 a > b*24 或 a/8 > b*2+b : 因為 b 在乘法運算後可能溢位,導致比較結果不正確 除了溢位問題以外,可能還有以下幾個常見問題: (1) 沒有人保證 unsigned (int) 寬度剛好是 32 位元,要玩弄位元請用 uint32_t. C99 標準(草稿 n1256 版)只有說 UINT_MAX 至少是 65535 (2^16-1). 目前流行的的編譯器+作業系統+處理器(LP64/LLP64 資料模型)int 都用 32 位元沒錯,但別忘了以前 16 位元橫行的時代恐怕只有 16 位元,而比較不流行 模型中可能也只有 16 位元。誰知道以後趨勢會不會又改了呢?ILP64 中 int 是 64 位元,而且也有人用。 (2) 整數除法問題。25/24 > 1 不成立,但 25 > 1*24 成立。就算沒溢位也錯。 : 結論:除非這家公司只能用特定平台的老舊 compiler,或是自己就在寫 compiler : 否則他們的 code 可能充滿 << >> 之類的位元運算, : 不但沒比較快,還要小心莫名奇妙的 bug : 建議原 po 仔細考慮一下再決定要不要去 非常同意結論!莫名其妙的 bug 包括未來資料模型一改(例如 ILP128 xD)可能馬上 又要重寫了。現在常見的編譯器一定會做一些基本的最佳化,實在沒必要為了這種東西花 時間,甚至讓程式碼更難讀懂...。 === 講一些比較有建設性的東西好了。Hacker's Delight 這本書有很多使用位元運算技巧 的程式碼可以參考。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39
DrStein:int 在理論上 不是與作業系統 同位元嗎? 06/16 03:03
「理論上」沒有任何關係;「實際上」在 AMD64 架構下,在 Windows 和大部分 *nix 中 常見的編譯器(好繞口)裡面的 int 都是 32 位元。「通常」只寫幾位元是代表指標、暫存器 等等有幾位元,是一個用來粗略描述處理器架構的一個方法,而不是 int 佔幾位元。不過這也 只是「通常」而已...
DrStein:是微軟開了惡例 讓int = long的吧 06/16 03:03
DrStein:話說回來為何 gcc也跟進啊? 06/16 03:04
恐怕 int 原本就跟處理器的能力沒有直接關係,不過你說 gcc 跟進是指?你用的處理器 架構和作業系統是什麼呢?
DrStein:EM64的ptr也是64位? 那插超過4G內存不就不能定位了 06/16 03:14
DrStein:講錯 也是32位? 是64吧 06/16 03:14
我猜你是說 EM64T. 指標大小和 int 大小恐怕一點關係也沒有。適合存指標的整數型態, 根據 C99 標準(n1256),是 intptr_t 或 uintptr_t, 不是 int 或 unsigned int. ※ 編輯: Favonia 來自: 140.112.30.39 (06/16 03:32)
tropical72:@DrStein: int 位元數問題之前有三個人發過三帖討論. 06/16 04:10
tropical72:#1DyGJ9Oy #1DyHaTxh #1DyP_lam 這和系統有關.看看吧. 06/16 04:10
tropical72:補個完整的,確實該翻翻spec如何規定,也看看系統為佳. 06/16 04:11
tropical72:並注意到,第一篇提到了,"int 大小未必就是CPU位元數" 06/16 04:14
loveme00835:XD 06/16 04:32
ericinttu:我覺得面試的考題, 有時候並不需要直接搬出大家心中最正 06/16 08:31
ericinttu:確又漂亮(簡短?)的答案. 06/16 08:32
ericinttu:如何表達出答題者考慮到哪些因素(如本篇),也是在展現 06/16 08:32
ericinttu:solver 的能力與價值. 06/16 08:33
angleevil:不認同樓上的想法 06/16 08:38
angleevil:大部分科技公司都沒認真想有用的考題,總是一味抄冷門 06/16 08:40
angleevil:又看似很深奧的題目,這樣真的好嘛?還是有飯碗較重要 06/16 08:41
※ 編輯: Favonia 來自: 140.112.30.39 (06/16 08:49)
ericinttu:考題就那幾個常出,重點在怎麼答. 06/16 09:43
james732:說不定有些公司的正確答案是「交給編譯器最佳化就好XD」 06/16 09:48
angleevil:= =這個答案更不認同 06/16 09:52
xatier:我倒覺得超哥的答案蠻有道理的 06/16 10:17
angleevil:超哥是誰? 06/16 13:17
ericinttu:超哥是誰? +1 06/16 14:02
purpose:好人超 james732 簡稱超哥 06/16 14:03
angleevil:james732真的是好人(發卡) 06/16 14:36
hilorrk:好人超的好人卡已經可以拿來組遊戲王卡牌了 不差這麼一張 06/16 14:54
loveme00835:傻眼@@" 06/16 15:04
angleevil:集個搭羅牌組,不是更好 06/16 15:04
james732:............幹嘛這樣 06/16 16:30
purpose:結束這個回合。 06/16 19:10
tropical72:< 啟動桌上覆蓋的陷井卡 "好人的召換" > 06/16 20:02
angleevil:結果樓上變成好人2 06/16 21:35