[问题] 变量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