我试图理解算术溢出。假设我有以下内容,
unsigned long long x;
unsigned int y, z;
x = y*z;
y*z 可能导致整数溢出。将其中一个操作数转换为 unsigned long long 是否可以缓解此问题。 64 位操作数与 32 位操作数相乘的预期结果是什么?
你显然假设unsigned int
是 32 位并且unsigned long long
64 位。他们不必是这样,让我们假设这一点。
通过转换 32 位操作数获得的 64 位操作数仍然适合 32 位。因此在y*(unsigned long long)z
,其中每个操作数首先提升为unsigned long long
,结果计算为unsigned long long
并且不能“溢出”,因为它是两个量的乘法,每个量都适合 32 位。
(此外,在 C 标准的词汇中,无符号运算不会“溢出”。溢出是在目标类型范围之外产生结果的未定义行为。无符号运算的作用是“环绕”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)