2

在做某事并遇到类似于以下的代码:

#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)- 因为结果将是一个始终大于或等于零的无符号字符。但是,代码按预期运行,我认为我的理解存在缺陷。所以...

我的问题是:

  1. 在计算表达式之前是否会发生到有符号字符的隐式类型转换?

  2. 是否存在上述代码不起作用的情况(例如,如果无符号值足够大以至于无法用有符号值表示)?

4

1 回答 1

2

在计算表达式之前是否会发生到有符号字符的隐式类型转换?

int不,在计算表达式之前会发生转换x - y¹。因此结果可能是否定的。

是否存在上述代码不起作用的情况(例如,如果无符号值足够大以至于无法用有符号值表示)?

如果sizeof int == 1,整数提升会将 s 提升unsigned charunsigned ints,这可能会产生错误的结果,因为在模 by 之前,由于无符号算术,会执行w模 by 。UINT_MAX + 1

¹ 默认整数提升。

于 2012-07-19T21:35:09.887 回答