无符号字符的隐式转换(算术转换与赋值)

时间:2012-07-19 21:33:06

标签: c casting

在处理某事时遇到类似以下的代码:

#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. 在计算表达式之前是否会发生对signed char的隐式类型转换?

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

1 个答案:

答案 0 :(得分:2)

  

在计算表达式之前是否会发生对signed char的隐式类型转换?

不,在评估表达式int之前,转换为x - y¹。因此结果可能是负面的。

  

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

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

¹默认的整数提升。