在am工作时,遇到了与以下代码类似的代码:

#define MODULUS(a,b)        ((a) >= 0 ? (a)%(b) : (b)-(-a)%(b))

unsigned char w;
unsigned char x;
unsigned char y;
char z;

/* Code that assigns values to w,x and y.  All values assigned
   could have been represented by a signed char. */

z = MODULUS((x - y), w);

据我所知,算术(x - y)将在任何类型转换之前完成,宏的计算值始终为(a)%(b)——因为结果将是一个始终大于或等于零的无符号字符但是,代码按预期运行,我认为我的理解有缺陷所以。。。
我的问题是:
在对表达式求值之前是否进行隐式类型转换为带符号字符?
是否存在上述代码不起作用的情况(例如,如果无符号值足够大,无法用有符号值表示)?

最佳答案

在对表达式求值之前是否进行隐式类型转换为带符号字符?
不,在计算表达式int之前会转换为x - y因此,结果可能是否定的。
是否存在上述代码不起作用的情况(例如,如果无符号值足够大,无法用有符号值表示)?
如果sizeof int == 1,整数提升会将unsigned chars提升到unsigned ints,这可能会产生错误的结果,因为在模乘w之前,由于无符号运算而执行模乘UINT_MAX + 1
1默认整数提升。

07-24 18:37
查看更多