[問題] 變數overflow

作者: pougoar   2019-12-07 10:02:05
請問一下
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的嗎 ?
謝謝
作者: jerryh001   2019-12-07 10:15:00
我直覺告訴我這是UB
作者: Lipraxde (Lipraxde)   2019-12-07 10:50:00
作者: dces4212 (flawless)   2019-12-07 12:24:00
不指定也一樣是unsigned short,因為運算元本身型態的關係,然後靠近MSB的FFFF不會被理會,那只是處理器在做運算時借位的數值,因為妳的資料型態是ushort,所以編譯器只會用對應的instruction去取值。另外要注意的是處理器沒有在分正負號,正負號的有無端看上層軟體怎麼看待這個數值
作者: Fenikso (薪水小偷)   2019-12-07 13:14:00
2樓是對的, 答案是-65525, signed int(如果int比short大)
作者: dces4212 (flawless)   2019-12-07 13:42:00
看Lvalue型態
作者: Lipraxde (Lipraxde)   2019-12-07 20:25:00
處理器沒有在分一筆資料是有號數還是無號數
作者: Fenikso (薪水小偷)   2019-12-07 20:36:00
處理器沒在分 但是c/c++標準有規定是有號還是無號啊或者換個講法, (y-x)>>1的shift要用SAR還是SHR?標準會跟你說y-x是signed所以這邊用SAR
作者: dces4212 (flawless)   2019-12-07 21:02:00
L大意思就是軟體層(e.g. 語言規格書)在做正負區分吧話說如果y,x無法靜態得知是不是就用SHR呢?阿應該是看資料型態來判別就好
作者: Lipraxde (Lipraxde)   2019-12-07 21:18:00
我只是看你說處理器沒在分正負號碼怪怪的,沒有想那麼多

Links booklink

Contact Us: admin [ a t ] ucptt.com