printf("%d\n", (unsigned char)255 * (unsigned char)255);
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是65025但不是1(255*255(mod 256)).为什么?
Kei*_*son 13
乘法运算符*将通常的算术转换应用于其操作数.这些转换将unsignedchar操作数转换为int.请参阅pmg的标准参考答案.
显然,您的系统类型int足够宽,可以保存结果值65025.在具有16位的系统int中INT_MAX == 32767,乘法将导致溢出,从而导致未定义的行为(通常会丢弃结果的高位).大多数现代系统都有32位int.
对于比intor 更窄的整数类型,没有乘法运算符unsigned int.
(严格地说,操作数可能转换为unsigned int而不是转换为int.只有在unsigned int能够代表整个范围unsigned char但int不能 - 而且在8位系统上不会发生时,才会发生这种情况char.)