看板 C_and_CPP 關於我們 聯絡資訊
嗨,大家今天過的好嗎? 網址: https://reurl.cc/nZnAe 裡面的一小段程式碼: float funky_float_abs (float a) { unsigned int temp = *(unsigned int *)&a; temp &= 0x7fffffff; return *(float *)&temp; } 取浮點數的絕對值 網址裡面說這樣寫會出問題,因為用char*與void*以外的型別(以這例子: unsigned int) 拿位址(&a)會讓pointer指到別的address上。 但我用TDM-GCC 4.9.2與ideone(gcc6.3)編譯並沒有出現問題 結果: https://ideone.com/HJ6qX0 因為stackoverflow的這篇文章是10年前,我在想這部分是不是後來在C standard有被修正 過,但是網路上找找不到相關資訊,故上來請教一下板友~ 感恩感恩 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.216.18 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1548221834.A.B4B.html
samuelcdf: #1CUzwZv7 請看本板討論串, 以前我被電過 +_+ 01/23 14:48
samuelcdf: 我找了一下午, 也沒有找到什麼資訊, 不過我想這只是因 01/23 17:30
samuelcdf: 為undefined behavior出來結果剛好跟我們想的一樣而已 01/23 17:31
lovejomi: 我比較想知道 乍看想法我都不會覺得有問題,該怎麼知道 01/23 19:05
lovejomi: 這寫法是很可能undefined behavior呢? 01/23 19:05
lovejomi: https://ideone.com/YKpnuL 請問這寫法會有問題嗎? 01/23 23:12
lovejomi: 假設是在little endian的機器上 我查了一下 轉成uchar* 01/23 23:13
lovejomi: 沒有違反 strict alias, 那這樣可以嗎?還是一樣有問題 01/23 23:13
samuelcdf: 用union, char*, unsigned char*都可以 01/24 09:37
descent: 可能你的 int, float 大小一樣 01/24 16:21
Sanvean: 手上有一個相反的例子 https://pastebin.com/Tf8Z4n2p 01/25 22:27
LPH66: strict aliasing rule 不是表示它真的指到別處了 01/26 14:31
LPH66: 而是編譯器會假設不同型態指標指的一定是不同物件 01/26 14:32
LPH66: 利用這個假設來進行許多的最佳化 01/26 14:32
LPH66: 這個是 C 語言標準給的自由空間 01/26 14:34
LPH66: 那編譯器在不同的最佳化層級下會不會用這條規則進行最佳化 01/26 14:35
LPH66: 就要看各自編譯器的設計了 01/26 14:35
IhateOGC: 這讓我想到C++當C寫的天兵 01/31 11:24