【发布时间】:2021-07-21 10:11:43
【问题描述】:
我认为以下代码可能会导致溢出,因为a * 65535 大于unsigned short int 可以容纳的值,但结果似乎是正确的。
C 中是否有一些内置机制可以将中间算术结果存储为更大的数据类型?还是只是意外?
unsigned char a = 30;
unsigned short int b = a * 65535 /100;
printf("%hu", b);
【问题讨论】:
-
你的编译器上
short int的位宽是多少?编译器通常使用其本机位宽进行常量表达式评估,因此它最有可能在 32 位或 64 位上计算,然后将结果截断为目标位宽......这同样适用于浮点/双精度,除非您明确键入 cat (1ull, . ..1.0, 1.0f,...)
标签: c math type-conversion integer-overflow integer-promotion