我想问一下
之间的结果是否存在差异(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。谢谢。
答案 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>