ssn*_*ssn 1 c c++ integer-overflow long-integer integer-arithmetic
我试图理解算术溢出.假设我有以下,
unsigned long long x;
unsigned int y, z;
x = y*z;
Run Code Online (Sandbox Code Playgroud)
y*z可能导致整数溢出.将其中一个操作数强制转换为unsigned long long可以缓解此问题.64位操作数与32位操作数相乘的预期结果是什么?
您显然假设它unsigned int是32位和unsigned long long64位.它们不一定是,让我们假设这一点.
通过转换32位操作数获得的64位操作数仍然适合32位.因此y*(unsigned long long)z,在每个操作数首次被提升到的情况下unsigned long long,结果被计算为a unsigned long long并且不能"溢出",因为它是两个量化的乘法,每个量子拟合32位.
(另外,在C标准的词汇表中,无符号运算不会"溢出".溢出是在目标类型的边界之外产生结果的未定义行为.无符号运算的作用是"环绕").