Typecast到unsigned char并乘以变量

时间:2015-06-08 19:04:59

标签: c

printf("%d\n", (unsigned char)255 * (unsigned char)255);

上面代码的输出是65025但不是1(255 * 255(mod 256))。为什么呢?

2 个答案:

答案 0 :(得分:13)

乘法运算符*通常的算术转换应用于其操作数。这些转换将unsigned char操作数转换为int。有关标准参考,请参阅pmg's answer

显然,您的系统类型int的宽度足以容纳结果值65025。在具有16位int的系统中,其中INT_MAX == 32767,乘法将导致溢出,从而导致未定义的行为(通常会丢弃结果的高位)。大多数现代系统都有32位int

对于比intunsigned int更窄的整数类型,没有乘法运算符。

(严格地说,操作数可能会转换为unsigned int而不是int。仅当unsigned int可以表示unsigned char的整个范围时才会发生这种情况。 },但int不能 - 而这在8位char的系统上不会发生。)

答案 1 :(得分:6)

*的操作数经历"usual arithmetic conversions"(C11标准p6.3.1.8)。

另见p6.5.5.2:Multiplicative operators

  

<强>语义
  通常的算术转换是在操作数上执行的。