printf("%d\n", (unsigned char)255 * (unsigned char)255);
上面代码的输出是65025但不是1(255 * 255(mod 256))。为什么呢?
答案 0 :(得分:13)
乘法运算符*
将通常的算术转换应用于其操作数。这些转换将unsigned
char操作数转换为int
。有关标准参考,请参阅pmg's answer。
显然,您的系统类型int
的宽度足以容纳结果值65025
。在具有16位int
的系统中,其中INT_MAX == 32767
,乘法将导致溢出,从而导致未定义的行为(通常会丢弃结果的高位)。大多数现代系统都有32位int
。
对于比int
或unsigned 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
<强>语义强>
通常的算术转换是在操作数上执行的。