Typecast到unsigned char并乘以变量

Kev*_*ong 6 c

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位的系统intINT_MAX == 32767,乘法将导致溢出,从而导致未定义的行为(通常会丢弃结果的高位).大多数现代系统都有32位int.

对于比intor 更窄的整数类型,没有乘法运算符unsigned int.

(严格地说,操作数可能转换为unsigned int而不是转换为int.只有在unsigned int能够代表整个范围unsigned charint不能 - 而且在8位系统上不会发生时,才会发生这种情况char.)


pmg*_*pmg 6

*经历"通常的算术转换"的操作数(C11标准p6.3.1.8).

另见p6.5.5.2:乘法运算符

语义
通常的算术转换是在操作数上执行的.