这两个操作之间有区别吗?

时间:2018-05-17 09:37:13

标签: c

我想问一下

之间的结果是否存在差异(s16Result)
int16_t s16X, s16Y, s16Result;

s16Result = (int16_t) (s16X - s16Y);

int16_t s16X, s16Y, s16Result;

s16Result = (int16_t) ((uint16_t) s16X - (uint16_t) s16Y)

s16X和s16Y的数据类型为signed integer,因此范围为-32767 ... 32767。谢谢。

1 个答案:

答案 0 :(得分:2)

这些语句通常不具有C标准定义的相同行为。考虑s16X具有其类型的最小值的时间(例如,在INT_MIN类型为16位的实现中可能int,因此它可以是-32767)和{{1}然后,在:

s16Y

表达式s16Result = (T_S16) (s16X - s16Y) 溢出 - -32769的数学结果在s16X - s16Y类型中无法表示,C标准未定义结果。

然而,在:

int

s16Result = (T_S16) ((T_U16) s16X - (T_U16) s16Y) 类型可能是无符号16位类型。在这种情况下,T_U16通过加或减65536转换为16位类型,产生32769. s16X保留其值2.然后减法产生32767.最后,此结果转换为s16Y类型,保留值32767。

因此,在带有带符号算术的语句没有C标准定义的值的某些情况下,带无符号算术的语句可能有一个定义的值。

(如果最终结果在T_S16类型中无法表示,则无符号算术的语句仍然具有未定义的行为,如最终结果是从32768到65535而不是从0到32767的数字。)< / p>