作者pougoar ()
看板C_and_CPP
標題[問題] 變數overflow
時間Sat Dec 7 10:02:05 2019
請問一下
32bit CPU
假設宣告一個變數為 unsigned short x (16 bit)
另外我也宣告一個unsigned short y (16 bit)
x = 65530 (0xFFFA)
y = 5 (0x0005)
實驗出來 (unsigned short) (y-x) = 0x0005 - 0xFFFA = 0xFFFF000B = 0x000B = 11
但是我如果不指定 (y - x)的資料型態
這值應該要多少 0xFFFF000B ? 而且是有signed的嗎 ?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.62.204.116 (韓國)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1575684127.A.CC4.html
※ 編輯: pougoar (223.62.204.116 韓國), 12/07/2019 10:07:04
1F:推 jerryh001: 我直覺告訴我這是UB 12/07 10:15
3F:→ Lipraxde: 1868 12/07 10:50
5F:→ dces4212: 不指定也一樣是unsigned short,因為運算元本身型態的 12/07 12:24
6F:→ dces4212: 關係,然後靠近MSB的FFFF不會被理會,那只是處理器在做 12/07 12:25
7F:→ dces4212: 運算時借位的數值,因為妳的資料型態是ushort,所以編 12/07 12:27
8F:→ dces4212: 譯器只會用對應的instruction去取值。另外要注意的是處 12/07 12:29
9F:→ dces4212: 理器沒有在分正負號,正負號的有無端看上層軟體怎麼看待 12/07 12:33
10F:→ dces4212: 這個數值 12/07 12:33
11F:推 Fenikso: 2樓是對的, 答案是-65525, signed int 12/07 13:14
12F:推 Fenikso: (如果int比short大) 12/07 13:30
13F:推 dces4212: 看Lvalue型態 12/07 13:42
14F:→ Lipraxde: 處理器沒有在分一筆資料是有號數還是無號數 12/07 20:25
15F:推 Fenikso: 處理器沒在分 但是c/c++標準有規定是有號還是無號啊 12/07 20:36
16F:推 Fenikso: 或者換個講法, (y-x)>>1的shift要用SAR還是SHR? 12/07 20:41
17F:→ Fenikso: 標準會跟你說y-x是signed所以這邊用SAR 12/07 20:42
18F:推 dces4212: L大意思就是軟體層(e.g. 語言規格書)在做正負區分吧 12/07 21:02
19F:→ dces4212: 話說如果y,x無法靜態得知是不是就用SHR呢? 12/07 21:03
20F:推 dces4212: 阿應該是看資料型態來判別就好 12/07 21:07
21F:→ Lipraxde: 我只是看你說處理器沒在分正負號碼怪怪的,沒有想那麼 12/07 21:18
22F:→ Lipraxde: 多 12/07 21:18