Cor*_*lks 9 c integer-promotion
可能重复:
分配给较大宽度的整数时的C整数溢出行为
我在google搜索中没有找到明确的答案.假设你有两个表达式:
int16_t a16 = 100;
int16_t b16 = 2000;
int16_t result16 = (a16 * b16) / a16;
int8_t a8 = 100;
int8_t b8 = 20;
int8_t result8 = (a8* b8) / a8;
Run Code Online (Sandbox Code Playgroud)
当评估表达式(a16 * b16) / a16和(a8 * b8) / a8,是他们总是晋升int评价中,然后最终结果被转换回所需的类型(int16_t或int8_t)就在分配之前,或者是这个整数的推广完全可选的?在评估整数表达式时总是进行整数提升,还是只是简单地允许?
如果它总是完成,那么我可以预期这两个操作不会溢出(假设int是32位).如果只允许(并且不需要),则操作可能会溢出.我想更好地了解这种行为.
int16_t result16 = (a16 * b16) / a16;
int8_t result8 = (a8* b8) / a8;
Run Code Online (Sandbox Code Playgroud)
这些声明与以下内容相同:
int16_t result16 = (int16_t) ((int) a16 * (int) b16) / (int) a16);
int8_t result8 = (int8_t) ((int) a8 * (int) b8) / (int) a8);
Run Code Online (Sandbox Code Playgroud)
整合促销是符合要求的实现所必需的.默认情况下,某些嵌入式编译器不执行整数提升以增强代码密度(例如:MPLAB C18编译器),但这些编译器通常也具有ANSI模式以符合要求.
现在对于C来说,行为是根据抽象机器来描述的,其中优化问题是无关紧要的.如果编译器可以在不执行整数提升的情况下为程序实现相同的可观察行为,则可以自由地不执行此操作.
假设你的int是32位,你是对的,这个表达式:(a16 * b16) / a16不能溢出.
| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |