分配给较大宽度的整数时的C整数溢出行为

Dav*_*ian 7 c integer casting overflow integer-overflow

如果我在C中执行以下代码:

#include <stdint.h>

uint16_t a = 4000;
uint16_t b = 8000;

int32_t c = a - b;

printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

它正确打印'-4000'作为结果.但是,我有点困惑:当从另一个中减去一个更大的无符号整数时,不应该有算术溢出吗?这里有什么施法规则?这个问题看起来有点愚蠢,所以任何参考文献都会非常感激.

Tra*_*Man 5

这个问题实际上有点复杂.算术表达式的操作数使用特定规则进行转换,您可以在标准(C89)的第3.2.1.5节中看到这些规则.在您的情况下,答案取决于类型uint16_t.如果它小于int,比如说short int,那么操作数被转换为int你得到-4000,但是在16位系统上,uint16_t可能是unsigned int并且转换为有符号类型不会自动发生.